为什么没有在shell脚本中返回引号帮助我cd到目录

时间:2012-08-20 06:22:11

标签: bash shell

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

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

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

2 个答案:

答案 0 :(得分:13)

当你跑步时:

`mkdir $dir`

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

然后你跑了:

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

副本在子shell中执行,输出被捕获并执行。同样,输出是空的,因此第二阶段的执行没有做任何事情。

然后你跑了:

`cd $dir`

再次,cd操作在子shell中运行,该子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 - 找出.命令(或bash中的source命令;更容易搜索)。

您通常使用后引号(或更好的$(...)表示法)来捕获数据。例如:

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

这样做更难,更难打字!

答案 1 :(得分:5)

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