Nenhum alias aqui
Vamos supor que temos a definição de alias alias rm='rm -i'
em nosso ~/.bashrc
. O alias adiciona a opção para solicitar antes de remover cada arquivo:
$ touch ./file
$ rm ./file
/bin/rm: remove regular empty file ‘./file’?
Não é culpa de strace
que ele não tenha usado o alias:
Não tem nada a ver com aliases.
No comando
$ strace -f -e file -o rm.strace rm ./file
As palavras rm
e ./file
são apenas argumentos para strace por enquanto - o shell não pode expandir o alias rm
, porque não pode saber que strace usará esses argumentos como comando mais tarde.
Em geral, os aliases de comando só podem ser usados onde os comandos podem ser.
Aliases são um recurso do shell, e strace
não usa um shell quando chama o comando a partir da linha de comando. Ele usa exec()
, com os comandos e argumentos de sua própria linha de comando.
Dentro de strace
, o comando será chamado com algo semelhante a exec("rm", "file")
e exec()
encontrará /bin/rm
em PATH - sem usar um shell.
Shell explícito
Agora, por que não incluir um shell no comando strace
?
$ touch ./file
$ strace -f -e file -o rm.strace bash -c 'rm ./file'
$ ls ./file
ls: cannot access ./file: No such file or directory
Hmm ... isso não funcionou. rm
acabou de excluir o arquivo, sem o prompt -i
.
Apelidos interativos
Os aliases são normalmente habilitados apenas em shells interativos, linhas de comando reais em um terminal.
Com nosso alias de exemplo, é fácil entender por que isso faz sentido: se o rm -i
alias fosse expandido dentro de scripts de shell, eles seriam interrompidos no primeiro rm
sem ninguém por pressionar y
.
Os aliases são controlados pela opção expand_aliases
do shell. Poderíamos definir a opção com bash +O expand_aliases -c ...
. Mas isso não é suficiente, porque o shell não interativo também não lerá ~/.bashrc
. Isso significa que o nosso alias não é apenas desligado pela opção, mas também não é definido.
Fingindo ser interativo
A maneira fácil de lidar com ambas as partes é usar a opção de linha de comando -i
para fazer com que a concha finja que é interativa:
$ touch ./file
$ strace -f -e file -o rm.strace bash -i -c 'rm ./file'
/bin/rm: remove regular empty file ‘./file’?
Finalmente, o -i
alias foi usado!
Observe que você normalmente não usaria shells executando com a opção -i
para scripts, mesmo se você quisesse ter seus aliases disponíveis, por exemplo.