【问题标题】:Why didn't back quotes in a shell script help me cd to a directory为什么 shell 脚本中的反引号不能帮助我 cd 到一个目录
【发布时间】:2014-04-29 08:55:13
【问题描述】:

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

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

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

【问题讨论】:

  • 你为什么认为这里需要反引号?
  • 我认为您对 what backticks do 感到困惑...我认为您的脚本根本不需要它们。
  • @David 该链接帮助了谢谢

标签: bash shell


【解决方案1】:

你跑的时候:

`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。我只能添加:引用您的 $dir 变量(例如,"$dir")。这样,空格之类的“奇怪”字符就不会在未来造成任何新问题。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    相关资源
    最近更新 更多