我已经使用 unix cygwin 一段时间了,最近添加了许多工具,命令行和脚本编写更加熟悉了。编写脚本和编程是我的首要目标,也是 10 万美元的问题?不过我还没有完全摆脱 Windows。
帖子在这里 ->解决了用户难题! 做了很多工作,使使用/切换路径和目录更加容易。比打开 notepad++ 并执行它更好!特别是这个命令
# cd "$(cygpath -u 'c:\Program Files\')"
作者:ben。可以在 bash 中即时运行,以便高效地构建脚本。
有人可以为了编程的需要把它分解成各个部分吗?
我注意到有 2 个命令和 - 引号,并且括号“分隔”了 $ ,我认为这是一个变量占位符???
我总是认为这是 shell 内置的,答案很简单,但仍然需要找出答案。外面的双引号是用来做什么的,而里面的单引号是用来空格和 shell 的文字解释的。
从头到尾,shell 到底在做什么?我相信运行调试可能是一个选项,我该怎么做才能显示输出?谢谢您的回复。
最后,我没有提到我曾经尝试转换路径的方法。我见过一些用于 sed 字符串的方法,但由于太复杂而没有成功,这个方法简单得多。
答案1
一个常见的误解是 $ 符号表示变量。它实际上向 bash 发出信号,要求其执行扩展(有些情况下,可以在不使用 $ 符号的情况下引用变量,但我不会离题太远)。
当 bash 看到变量前面的 $ 符号时,它会用(变量的)值替换 $VAR,然后执行整行。
在您的示例中,bash 将执行命令替换/扩展。括号之间是一个命令,bash 将首先执行该命令,获取输出并用其替换 $(command),然后执行该cd
命令。
您可以通过查看跟踪来观察此行为。使用bash -x
或将 放在set -o xtrace
脚本标题下方来执行脚本。示例:
#!/bin/bash
set -o xtrace
这将输出 bash 在脚本期间执行的确切命令,这意味着在替换/扩展发生之后。
至于引号,它们不是 100% 必要的,但在某些情况下,您的示例中的命令可能无法正常工作。那就是如果 返回的路径中有空格cygpath -u 'c:\Program Files\'
。Bash 命令参数通常由空格分隔,如果没有引号,bash 会将这些空格解释为分隔符而不是文字空格(这也是为什么 cygpath 命令指定的路径周围有单引号的原因)。
例如,如果返回的路径是c:\user\Documents and Settings
,不带引号,bash 会将命令读为cd c:\user\Documents and Settings
,其中它会认为c:\user\Documents
、and
和Settings
都是要传递给cd
命令的参数。这是一个问题,因为该cd
命令应该只有一个参数。
$ 替换周围的双引号可防止空格解释。