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

bha*_*avs 5 bash shell

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

dir=sample
`mkdir $dir`
`cp /home/bhavya/workspace/UnetStack/logs/log-0.txt $dir/log.txt`
`cd $dir`
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*ler 13

当你跑:

`mkdir $dir`
Run Code Online (Sandbox Code Playgroud)

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

然后当你跑:

`cp /home/bhavya/workspace/UnetStack/logs/log-0.txt $dir/log.txt`
Run Code Online (Sandbox Code Playgroud)

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

然后你跑了:

`cd $dir`
Run Code Online (Sandbox Code Playgroud)

再一次,该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...
Run Code Online (Sandbox Code Playgroud)

请注意,如果这是在脚本中,那么执行脚本的常规方法仍然会将父shell保留在原始目录中.有办法让它影响到原来的壳-摸透.命令(或在bashsource命令,这是便于搜索).

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

gcc_lib_dir=$(dirname $(dirname $(which gcc)))/lib
Run Code Online (Sandbox Code Playgroud)

最里面的命令是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
Run Code Online (Sandbox Code Playgroud)

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

gcc_lib_dir=`dirname \`dirname \\\`which gcc\\\`\``/lib
Run Code Online (Sandbox Code Playgroud)

这样做更难,更难打字!

  • +1.我只能添加:引用你的`$ dir`变量(例如,``$ dir"`).这样,像空格一样的"奇怪"字符将来不会引起任何新问题. (2认同)

Ign*_*ams 5

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