Abh*_*rma 4 alias cp rm bashrc
为 rm 命令创建别名,以便在rm执行命令时先复制文件/tmp/recycle_bin,然后删除文件。但我在这个过程中遇到了问题。
我执行的步骤:
我在~/.bashrc文件中写了以下命令:
alias rm='cp $@ /tmp/recycle_bin && rm $@'
Run Code Online (Sandbox Code Playgroud)使用以下命令执行它:
. ~/.bashrc
Run Code Online (Sandbox Code Playgroud)打开新终端并执行以下命令:
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)需要了解:
即使参数作为我要删除的文件传递给 rm 命令。为什么我收到错误**缺少目标文件操作数之后/tmp/recycle_bin?
$@别名命令中的变量未填充?如何调试这个案例并解决?
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)的变体,请参阅“在不使用函数的情况下创建回收站功能”。