Um alias não pode receber argumentos e usar $@
para acessá-los dessa maneira.
A expansão de alias em bash
é uma substituição de texto simples. Se você tem alias rm ='something something'
, então usar rm file1 file2
seria executado
something something file1 file2
e se o alias incluía $@
, isso seria expandido com os argumentos da linha de comando o shell , não do alias.
No seu caso, supondo que a lista de argumentos de linha de comando do shell esteja vazia, o alias
alias rm='cp $@ /tmp/recycle_bin && rm $@'
seria executado como
cp /tmp/recycle_bin && rm file1 file2
quando chamado como rm file1 file2
. O utilitário cp
irá reclamar sobre ter apenas um único operando.
Você poderia usar uma função de shell:
rm () {
cp -- "$@" "${TMPDIR:-/tmp}/recycle_bin" &&
command rm -- "$@"
}
Isso copiaria os arquivos indicados para $TMPDIR/recycle_bin
(ou /tmp/recycle_bin
se TMPDIR
não estiver definido ou vazio) e, em seguida, excluir os arquivos. O comando command
é usado para não causar uma recursão infinita. O --
é necessário para tratar todos os argumentos como nomes de arquivos, e não como opções. Note também que a citação é importante para que os nomes de arquivos não sejam divididos em espaços em branco e para que os padrões de globalização de nomes de arquivo nos argumentos não estejam selecionando arquivos que você não deseja remover.
Um pouco mais eficiente ( cp
+ rm
== mv
):
rm () {
mv -- "$@" "${TMPDIR:-/tmp}/recycle_bin"
}
Um pouco mais seguro (cria a lixeira, se não estiver lá):
rm () {
mkdir -p "${TMPDIR:-/tmp}/recycle_bin" &&
mv -- "$@" "${TMPDIR:-/tmp}/recycle_bin"
}
E ainda mais seguro, com GNU mv
(cria backups na lixeira se ocorrer colisões de nomes):
rm () {
mkdir -p "${TMPDIR:-/tmp}/recycle_bin" &&
mv -b -- "$@" "${TMPDIR:-/tmp}/recycle_bin"
}
Para uma variação somente de alias (e somente GNU), consulte " Crie um recurso de lixeira sem usar as funções ".