我有下面的代码的shell脚本:
dir=sample
`mkdir $dir`
`cp /home/bhavya/workspace/UnetStack/logs/log-0.txt $dir/log.txt`
`cd $dir`
在与最后一行cd
在反引号命令,我是不是能够cd
到相应的目录中。 但是,一旦我删除了反引号我能够cd
。 我想知道是为什么没有cd
与反引号的工作?
我有下面的代码的shell脚本:
dir=sample
`mkdir $dir`
`cp /home/bhavya/workspace/UnetStack/logs/log-0.txt $dir/log.txt`
`cd $dir`
在与最后一行cd
在反引号命令,我是不是能够cd
到相应的目录中。 但是,一旦我删除了反引号我能够cd
。 我想知道是为什么没有cd
与反引号的工作?
当你运行:
`mkdir $dir`
壳第一运行的命令mkdir $dir
在Subshell,捕捉其(标准)输出,然后运行所捕获的字符串作为一个命令。 幸运的是,输出是空的,所以第二个步骤执行什么。
当那么你跑:
`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
这是很难得到正确的,并且更难型!
反引号在子shell中运行的命令。 子shell改变了目录,但也没有办法传播这个备份到脚本的shell。