制作rm命令的别名

Abh*_*rma 4 alias cp rm bashrc

为 rm 命令创建别名,以便在rm执行命令时先复制文件/tmp/recycle_bin,然后删除文件。但我在这个过程中遇到了问题。

我执行的步骤:

  1. 我在~/.bashrc文件中写了以下命令:

    alias rm='cp $@ /tmp/recycle_bin && rm $@'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用以下命令执行它:

    . ~/.bashrc
    
    Run Code Online (Sandbox Code Playgroud)
  3. 打开新终端并执行以下命令:

    rm "/home/XXXXX/My_Programs/test_method.py"
    cp: missing destination file operand after '/tmp/recycle_bin'** got this error message 
    
    Run Code Online (Sandbox Code Playgroud)

需要了解:

  1. 即使参数作为我要删除的文件传递给 rm 命令。为什么我收到错误**缺少目标文件操作数之后/tmp/recycle_bin

  2. $@别名命令中的变量未填充?如何调试这个案例并解决?

Kus*_*nda 24

别名不能接受参数并使用它$@来访问它们。

别名扩展bash是一个简单的文本替换。如果有alias rm ='something something',则 usingrm file1 file2将执行

something something file1 file2
Run Code Online (Sandbox Code Playgroud)

如果包含别名$@,这将使用shell的命令行参数进行扩展,而不是别名。

在您的情况下,假设 shell 的命令行参数列表为空,则别名

alias rm='cp $@ /tmp/recycle_bin && rm $@'
Run Code Online (Sandbox Code Playgroud)

将执行为

cp /tmp/recycle_bin && rm file1 file2
Run Code Online (Sandbox Code Playgroud)

当作为rm file1 file2. 该cp实用程序会抱怨只有一个操作数。


您可以改用 shell 函数:

rm () {
    cp -- "$@" "${TMPDIR:-/tmp}/recycle_bin" &&
    command rm -- "$@"
}
Run Code Online (Sandbox Code Playgroud)

这会将指示的文件复制到$TMPDIR/recycle_bin(或者/tmp/recycle_bin如果TMPDIR未设置或为空),然后删除这些文件。该command命令用于不引起无限递归。将--需要把所有的参数作为文件名,而不是作为选项。还要注意的是引用,使文件名不拆的空格,因此,在参数文件名匹配模式,不拾取文件,您是非常重要的希望删除。

效率更高(cp+ rm== mv):

rm () {
    mv -- "$@" "${TMPDIR:-/tmp}/recycle_bin"
}
Run Code Online (Sandbox Code Playgroud)

更安全一点(如果不存在,则创建回收站):

rm () {
    mkdir -p "${TMPDIR:-/tmp}/recycle_bin" &&
    mv -- "$@" "${TMPDIR:-/tmp}/recycle_bin"
}
Run Code Online (Sandbox Code Playgroud)

使用 GNU 甚至更安全mv(如果发生名称冲突,则会在回收站中创建备份):

rm () {
    mkdir -p "${TMPDIR:-/tmp}/recycle_bin" &&
    mv -b -- "$@" "${TMPDIR:-/tmp}/recycle_bin"
}
Run Code Online (Sandbox Code Playgroud)

有关仅别名(和仅 GNU)的变体,请参阅“在不使用函数的情况下创建回收站功能”。