以下脚本完成归档工作/home/jerzy/testdir/:
#!/usr/bin/bash
XZ_OPT=-9 tar -cJf /home/jerzy/testdir.tar.xz -C /home/jerzy testdir && \
echo "testdir/ already archived"
Run Code Online (Sandbox Code Playgroud)
尽管如此,它还是给了我以下输出:
line 3: : command not found
testdir/ already archived
Run Code Online (Sandbox Code Playgroud)
当XZ_OPT=-9 tar -cJf /home/jerzy/testdir.tar.xz -C /home/jerzy testdir从终端执行时,它会完成其工作而不会吐出command not found。为什么当从我得到的脚本执行同一行时会出现这种情况command not found?指定完整路径,即/usr/bin/tar不能解决问题。
我的环境:Ubuntu Desktop 20.04LTS,which tar返回/usr/bin/tar.
在tar命令之后,您有&&一个续行。或者更确切地说,如果后没有空格,它将是续行\。
由于该行末尾的 后面有一个或多个空格\,因此 shell 会将其解释为名称为单个空格的命令。找不到该命令。
测试运行名称为单个空格的命令:
$ ' '
bash: : command not found
$ \ # an escaped space
bash: : command not found
Run Code Online (Sandbox Code Playgroud)
(未找到的命令名称是bash:和之间的两个空格中的第二个: command not found。)
解决方案是删除后面的空格\,使反斜杠成为该行的最后一个字符(转义换行符)。
或者,完全删除\。此时脚本中不需要续行。
#!/bin/sh
XZ_OPT=-9 tar -cJ -f ~jerzy/testdir.tar.xz -C ~jerzy testdir &&
echo '"testdir" archived'
Run Code Online (Sandbox Code Playgroud)
我/bin/sh在这里使用而不是bash因为脚本中没有任何要求bash。我还冒昧地使用波浪号语法来访问用户的主目录jerzy。这样,您的脚本甚至可以在主目录位于其他地方的系统上运行,就像它们在 macOS 上一样。如果您想引用当前用户的主目录,我会使用"$HOME"它。
有几种方法可以使命令echo取决于命令的成功或失败更加明显tar。例如,您可以缩进echo命令:
XZ_OPT=-9 tar -cJ -f ~jerzy/testdir.tar.xz -C ~jerzy testdir &&
echo '"testdir" archived'
Run Code Online (Sandbox Code Playgroud)
...或者,如果它不会导致行太长,则只需不要中断行:
XZ_OPT=-9 tar -cJ -f ~jerzy/testdir.tar.xz -C ~jerzy testdir && echo '"testdir" archived'
Run Code Online (Sandbox Code Playgroud)
你甚至可以把它变成一个完整的 -if语句:
if XZ_OPT=-9 tar -cJ -f ~jerzy/testdir.tar.xz -C ~jerzy testdir
then
echo '"testdir" archived'
else
exit
fi
Run Code Online (Sandbox Code Playgroud)