为什么当从脚本执行 tar 时,我得到“找不到命令”(它运行时没有从终端给我这样的输出)?

为什么当从脚本执行 tar 时,我得到“找不到命令”(它运行时没有从终端给我这样的输出)?

以下脚本完成归档工作/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

相关内容