Como usar o alias em command_string?

0

Normalmente eu tenho um arquivo .bashrc onde o alias é definido como

alias ll='ls -l'

Quando invoco ll manualmente, funciona muito bem. No entanto, às vezes eu preciso executar o comando de uma string. Então, gostaria de executar:

COMMAND="ll"
bash --login -c "$COMMAND"

Infelizmente isso reclama que o comando ll não foi encontrado e falha. Se eu verificar se realmente está definido neste escopo, eu verifico assim:

COMMAND="alias"
bash --login -c "$COMMAND"

o acima mencionado imprime todos os meus aliases corretamente.

Existe alguma maneira de usar comandos com alias no parâmetro -c command_string do bash?

    
por Tomas M 06.11.2017 / 23:08

2 respostas

0

Algumas coisas a serem observadas aqui, primeiro sobre a execução da opção --login :

When bash is invoked as an interactive login shell, or as a non-inter‐
active shell with the --login option, it first reads and executes  com‐
mands  from  the file /etc/profile, if that file exists. After reading
that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile,
in  that order, and reads and executes commands from the first one that
exists and is readable.

Portanto, este comando não está lendo seu .bashrc . Em segundo lugar, os aliases funcionam apenas em shells interativos, portanto, mesmo que esse alias esteja sendo gerado, ele não funcionará em seu comando. Funções, no entanto, funcionam em shells não interativos. Portanto, você deve converter seus aliases em funções e fornecê-los em uma das coisas mencionadas acima, como ~/.bash_profile .

Como alternativa, você pode exportar funções definidas no ambiente atual para aquela herdada por bash -c . Eu tenho essa função:

adrian@adrian:~$ type fn
fn is a function
fn () 
{ 
    find . -name "$1"
}

Qual eu posso chamar em um subshell assim:

adrian@adrian:~$ export -f fn
adrian@adrian:~$ bash -c "fn foo*"
./foo.bar
    
por 07.11.2017 / 00:33
0

.bashrc é lido apenas sob determinadas condições, portanto, faça isso:

$ cat ~/.bashrc
echo being read
alias foo='echo bar'
$ bash -c foo
bash: foo: command not found
$ bash -i -c foo
being read
bar
$ 

Uma passagem rápida por bash(1) para interactive pode aparecer

   Aliases  are not expanded when the shell is not interactive, unless the
   expand_aliases shell option is set using shopt (see the description  of
   shopt under SHELL BUILTIN COMMANDS below).

que pode fornecer várias outras maneiras de ativar isso além de lançar -i na lista de argumentos.

(Dito isto, eu absolutamente não uso aliases em shells não interativos, como bash -c )

    
por 06.11.2017 / 23:40

Tags