为什么没有在shell脚本反引号帮我cd到一个目录(Why didn't back quot

2019-06-27 04:39发布

我有下面的代码的shell脚本:

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

在与最后一行cd在反引号命令,我是不是能够cd到相应的目录中。 但是,一旦我删除了反引号我能够cd 。 我想知道是为什么没有cd与反引号的工作?

Answer 1:

当你运行:

`mkdir $dir`

壳第一运行的命令mkdir $dir在Subshel​​l,捕捉其(标准)输出,然后运行所捕获的字符串作为一个命令。 幸运的是,输出是空的,所以第二个步骤执行什么。

当那么你跑:

`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...

需要注意的是,如果这是一个脚本,然后执行脚本的正常方式将仍然留在母贝原目录。 有办法让它影响到原来的壳-摸透. 命令(或者,在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

这是很难得到正确的,并且更难型!



Answer 2:

反引号在子shell中运行的命令。 子shell改变了目录,但也没有办法传播这个备份到脚本的shell。



文章来源: Why didn't back quotes in a shell script help me cd to a directory
标签: bash shell