Bash 为什么没有';t shell脚本中的反引号帮助我将cd放入目录

Bash 为什么没有';t shell脚本中的反引号帮助我将cd放入目录,bash,shell,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为什么不能使用反引号?反引号在子shell中运行命令。子shell更改了目录,但无法将其传播回脚本的shell。运行时: `mkdir

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

dir=sample
`mkdir $dir`
`cp /home/bhavya/workspace/UnetStack/logs/log-0.txt $dir/log.txt`
`cd $dir`
在后引号中带有
cd
命令的最后一行中,我无法
cd
进入相应的目录。 但是一旦我删除了反引号,我就能够
cd

我想知道的是,
cd
为什么不能使用反引号?

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

运行时:

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

当你跑的时候:

`cp /home/bhavya/workspace/UnetStack/logs/log-0.txt $dir/log.txt`
副本在子shell中执行,输出被捕获并执行。同样,输出是空的,所以执行的第二阶段什么也没做

然后你跑:

`mkdir $dir`
`cd $dir`
再次,在子shell中运行
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—了解
命令(或者,在
bash
中,查找
源代码
命令;这更容易搜索)

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

gcc_lib_dir=$(dirname $(dirname $(which gcc)))/lib
最里面的命令是
哪个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

这很难准确,也很难打字

你为什么认为你需要反报价?我想你对。。。我认为你的脚本根本不需要它们。@David这个链接帮助我澄清了为什么我需要在脚本+1中使用反勾号以及在哪里使用反勾号。我只能添加:引用您的
$dir
变量(例如,
“$dir”
)。这样,像空格之类的“奇怪”字符在将来不会引起任何新问题。