Criando alias do comando rm [duplicado]

4

Fazendo alias do comando rm para que, quando o comando rm for executado, ele primeiro copie o arquivo para /tmp/recycle_bin e, em seguida, remova o arquivo. Mas estou tendo problemas no processo.

Passos realizados por mim:

  1. Eu escrevi abaixo o comando em ~/.bashrc file:

    alias rm='cp $@ /tmp/recycle_bin && rm $@'
    
  2. execute com o comando abaixo:

    . ~/.bashrc
    
  3. Abra um novo terminal e execute o comando abaixo:

    rm "/home/XXXXX/My_Programs/test_method.py"
    cp: missing destination file operand after '/tmp/recycle_bin'** got this error message 
    

Precisa entender:

  1. Mesmo se o parâmetro for passado para o comando rm como o arquivo que desejo remover. Por que estou recebendo o erro ** operando o arquivo de destino ausente após /tmp/recycle_bin ?

  2. A variável $@ no comando alias não está preenchida? Como depurar este caso e resolver?

por Abhishek Verma 06.07.2018 / 12:18

2 respostas

23

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 ".

    
por 06.07.2018 / 12:26
2

Bash e a maioria das shells derivadas de Bourne não suportam aliases parametrizados.

Você não pode fazer as coisas dessa maneira.

Um método de trabalho era definir um apelido que fosse expandido:

sh -c 'cp -- "$@" /tmp/recycle_bin && rm -- "$@"' sh

Isso resulta no seguinte comando:

myrm='sh -c '\''cp -- "$@" /tmp/recycle_bin && rm -- "$@"'\'' sh'

Observe que isso pode ser feito sem a sobrecarga de criar um novo processo de shell se você usar uma versão recente do Bourne Shell (bosh). Esse shell inclui um comando interno dosh que age como o script de uma linha de uma chamada sh -c . Esse conceito de aliases parametrizáveis foi inventado pelos antigos funcionários da AT & T em 1980 e implementado em seu clone UNIX em tempo real chamado UNOS .

Com bosh você pode usar:

myrm='dosh '\''cp -- "$@" /tmp/recycle_bin && rm -- "$@"'\'' myrm'

BTW: O Bourne Shell ajuda você a digitar o comando alias no modo raw e criar automaticamente as seqüências de escape necessárias para os caracteres de aspas simples. Eu não escrevi esta linha de comando feia com escapes eu mesmo, mas deixe bosh criá-lo a partir da linha de comando original acima.

    
por 06.07.2018 / 12:26

Tags