Execute outro comando antes de executar o comando que o usuário deseja executar

9

Digamos que eu queira modificar o comportamento original da lsferramenta desta maneira:

$ ls
Hello World
file1 file2 ...

Como posso fazer isso?

Ao executar ls, gostaria de executar outro comando, digamos echo "Hello World!".

A solução rápida que vejo é usar o alias:

alias orig_ls="ls"
alias ls='echo "Hello World!"'

No entanto, essa não é uma solução real, pois quando executarei, orig_lsela será exibida "Hello World!".

Ionică Bizău
fonte
Coloque outro ls no caminho do usuário e use-o para conectar o original.
peterh - Restabelece Monica

Respostas:

12

Às vezes, um alias não é poderoso o suficiente para fazer o que você deseja com facilidade, então aqui está uma maneira de usá-lo.

Em algum arquivo que é originado quando o shell é iniciado (por exemplo .bashrc), adicione a seguinte função:

ls () {
    echo "Hello world!"
    command ls "$@"
}

Ao contrário de um alias, uma função pode ser recursiva. É por isso que command lsé usado em vez de ls; Ele diz ao seu shell para usar a função real em lsvez da função que você acabou de definir.

undergroundmonorail
fonte
2
De fato. Essa solução dimensiona melhor. +1
PythonNut
Qual é a commandalternativa para o OS X?
Bizonic
@ IonicăBizău Não tenho idéia command, não funcionou: / Não tenho idéia e não tenho um Mac com o qual testá-lo, desculpe.
Undergroundmonorail
9

Você não deve esquecer de ligar para ls:

alias ls='echo "Hello World!"; ls'
Hauke ​​Laging
fonte
Ha! Suponho que isso criará um ciclo infinito! Mas por que não cria um loop infinito?
Jonic Biz
1
Você pode tentar o apelido ls 'echo "Hello World!"; / usr / bin / ls '
jamesqf 25/01
5
@ IonicăBizău qualquer regra de expansão de alias é usada apenas uma vez.
David Z
Juntar os dois com um & também funciona? Isso também garantiria que o comando do usuário seja executado apenas se o comando personalizado funcionar, certo?
Fund Monica's Lawsuit
@QPaysTaxes Você pode &realmente usar , mas eu não entendo o argumento que você faz disso.
Hauke ​​Laging 26/01/15