以下脚本完成归档工作/home/jerzy/testdir/
:
#!/usr/bin/bash
XZ_OPT=-9 tar -cJf /home/jerzy/testdir.tar.xz -C /home/jerzy testdir && \
echo "testdir/ already archived"
尽管如此,它还是给了我以下输出:
line 3: : command not found
testdir/ already archived
当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
.
答案1
在tar
命令之后,您有&&
一个续行。或者更确切地说,这将是一个延续如果后面没有空格\
。
由于该行末尾的 后面有一个或多个空格\
,因此 shell 会将其解释为名称为单个空格的命令。找不到该命令。
测试运行名称为单个空格的命令:
$ ' '
bash: : command not found
$ \ # an escaped space
bash: : command not found
(未找到的命令名称是bash:
和之间的两个空格中的第二个: command not found
。)
解决方案是删除后面的空格\
,使反斜杠成为该行的最后一个字符(转义换行符)。
或者,完全删除\
。此时脚本中不需要续行。
#!/bin/sh
XZ_OPT=-9 tar -cJ -f ~jerzy/testdir.tar.xz -C ~jerzy testdir &&
echo '"testdir" archived'
我/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'
...或者,如果它不会导致行太长,则只需不要中断行:
XZ_OPT=-9 tar -cJ -f ~jerzy/testdir.tar.xz -C ~jerzy testdir && echo '"testdir" archived'
你甚至可以把它变成一个完整的if
- 语句:
if XZ_OPT=-9 tar -cJ -f ~jerzy/testdir.tar.xz -C ~jerzy testdir
then
echo '"testdir" archived'
else
exit
fi