Função que interpreta os caracteres 'n' à direita de uma palavra como argumento

1

Existe uma maneira de passar os caracteres n à direita de um comando para uma função, para que ela seja executada como dois comandos? Por exemplo eu defino minha função como abcx e sempre que eu entro

abcxfoo

para a linha de comando, minha função interpreta como abcx foo . Estou ciente de passar argumentos como $1 e $@ , mas em alguns casos, uma função definida uma vez como essa acima pode realmente ser uma economia de tempo.

O que estou me referindo é que eu tenho um monte de cd aliases que eu gostaria de chamar como cdlinux , me fazendo mudar para ~ / Documents / Linux , sem a necessidade de definir um alias para cada pasta dentro do meu Documents (que é o que eu fiz até agora até a data).

    
por emzap79 21.05.2014 / 00:20

2 respostas

2

Você não pode fazer exatamente isso, mas com um pouco de trabalho e bash 4, você pode implementar o recurso.

Quando o bash 4 encontra um comando indefinido, ele procura por uma função do shell chamada command_not_found_handle e, se a encontrar, ela a chama, passando o nome do comando não encontrado como $1 e os argumentos restantes como $2 . .

Portanto, você poderia, por exemplo, manipular seus comandos cd e ffdir adicionando algo assim ao seu arquivo .bashrc . (nota: eu não ligo com insensibilidade a maiúsculas e minúsculas aqui, então ainda há algum trabalho a fazer.)

command_not_found_handle() {
  case $1 in
    cd*) if [[ -d "$HOME/Documents/${1#cd}" ]]; then
           cd "$HOME/Documents/${1#cd}"
           return 0
         fi
         # On failure, falls through to the error message
         ;;
    ffdir*) find . -type d -iname "${1#ffdir}"
            return 0
            ;;
    # Etc...
  esac

  # If nothing else works, just do what bash would have done
  printf "%s: command not found\n" "$1" >&2
  return 127
}
    
por 21.05.2014 / 05:43
0

Não. O que você está pedindo é impossível, como o shell poderia adivinhar onde o nome da função termina? Ele precisa de um espaço para saber que deve tentar interpretar o que você escreveu como um comando.

No entanto, o que você está procurando é provavelmente o CDPATH variável de ambiente:

CDPATH

A colon-separated list of directories used as a search path for the cd builtin command.

Isso é usado por cd da seguinte forma:

cd

  cd [-L|[-P [-e]]] [directory]

Change the current working directory to directory. If directory is not given, the value of the HOME shell variable is used. If the shell variable CDPATH exists, it is used as a search path. If directory begins with a slash, CDPATH is not used.

Em outras palavras, se você definir CDPATH no seu ~/.bashrc da seguinte forma:

export CDPATH=".:~/Documents"

Você poderá, então, cd e usar a conclusão da tabulação para listar todos os subdiretórios de ~/Documents , como se você já estivesse dentro de ~/Documents .

Outra abordagem seria usar uma função. Basta adicionar isso ao seu ~/.bashrc :

cddoc(){
    cd "$HOME/Documents/$1"
}

Isso, no entanto, tem a desvantagem de que a conclusão da guia não funcionará. Você pode contornar isso, mas não vale a pena, dado que CDPATH é provavelmente exatamente o que você está procurando.

    
por 21.05.2014 / 00:52