5

我有一个带有以下代码的 shell 脚本:

dir=sample
`mkdir $dir`
`cp /home/bhavya/workspace/UnetStack/logs/log-0.txt $dir/log.txt`
`cd $dir`

在反引号中的命令的最后一行cd,我无法cd进入相应的目录。但是一旦我删除了后面的引号,我就可以了cd。我想知道的是为什么没有cd后引号的工作?

4

2 回答 2

13

当你跑的时候:

`mkdir $dir`

shell 首先mkdir $dir在子shell 中运行命令,捕获其(标准)输出,然后将捕获的字符串作为命令运行。幸运的是,输出是空的,所以第二步什么也没执行。

然后当您运行时:

`cp /home/bhavya/workspace/UnetStack/logs/log-0.txt $dir/log.txt`

副本在子shell中执行,输出被捕获并执行。同样,输出是空的,所以执行的第二阶段什么也没做。

然后你跑了:

`cd $dir`

再一次,cd操作在一个子 shell 中运行,它在更改自己的当前工作目录后退出,但不影响父 shell(这是 Unix,不是 DOS.bat命令文件)。和以前一样,cd命令的输出被捕获并执行,但是输出是空的,所以没有什么可以执行的。

本质上,您不会像现在那样广泛使用反引号。

写下就足够了:

dir=sample
mkdir $dir
cp /home/bhavya/workspace/UnetStack/logs/log-0.txt $dir/log.txt
cd $dir
...other activity in the new directory...

请注意,如果这是在脚本中,则执行脚本的正常方式仍会将父 shell 留在原始目录中。有一些方法可以让它影响原始 shell — 找出.命令(或者,在 中bashsource命令;这更容易搜索)。

您通常使用反引号(或者更好的$(...)符号)来捕获数据。例如:

gcc_lib_dir=$(dirname $(dirname $(which gcc)))/lib

最里面的命令是which gcc; 它可能会产生/usr/gcc/v4.7.1/bin/gcc;内部dirname然后产生/usr/gcc/v4.7.1/bin;外部目录名产生/usr/gcc/v4.7.1;附加的/lib给出

gcc_lib_dir=/usr/gcc/v4.7.1/lib

这也说明了为什么$(...)优于反引号表示法:

gcc_lib_dir=`dirname \`dirname \\\`which gcc\\\`\``/lib

这更难正确,也更难打字!

于 2012-08-20T06:33:19.813 回答
5

反引号在子 shell 中运行命令。子shell 更改了目录,但无法将其传播回脚本的shell。

于 2012-08-20T06:24:11.247 回答