【SHELL】反斜杠解决多个shell实例扩展
本意是想获取代码仓相对路径,代码如下
base_dir=`pwd`
repo forall -c '{
user_dir=$(realpath --relative-to="$base_dir" "$PWD")
echo $user_dir
}'
执行后报错 realpath: '': No such file or directory
分析原因
这个问题的原因是repo forall -c命令在每个仓库中执行一个新的shell实例,这个新的shell实例不会继承当前shell实例的环境变量。所以,虽然在repo forall -c命令之前定义了$base_dir,但是在repo forall -c命令中的shell实例并不能访问到它。
解决这个问题的一种方法是在repo forall -c命令中直接使用$base_dir的值,而不是使用$base_dir变量。可以使用双引号来实现这一点,因为在双引号中的变量会被shell自动扩展。
修改如下:
base_dir=`pwd`
repo forall -c "{
user_dir=\$(realpath --relative-to=\"$base_dir\" \"\$PWD\")
echo \$user_dir
}"
使用了反斜杠(\)来转义特殊字符,以防止它们在repo forall -c命令中被提前扩展。这样,$base_dir和$PWD就会在每个仓库的shell实例中被正确地扩展了。
反斜杠(\)来转义特殊字符
在shell脚本中,反斜杠(\)是一个特殊的字符,被称为转义字符。它的作用是改变紧跟其后的字符的含义。当你在一个字符前面加上反斜杠,shell会将这个字符视为普通字符,而不是特殊字符。
在上面的例子中,反斜杠被用来转义$字符。在shell脚本中,$字符通常用来引用变量。例如,$PWD会被替换为当前工作目录的路径。但是,如果你在$字符前面加上反斜杠,如\$PWD,shell就会把$PWD当作普通的字符串,而不会替换为当前工作目录的路径。
同样,反斜杠也被用来转义双引号(")。在shell脚本中,双引号用来定义字符串。如果你在双引号内部的$字符前面加上反斜杠,如\"$PWD\",那么$PWD就会在每个新的shell实例中被扩展,而不是在当前的shell实例中被提前扩展。
总的来说,反斜杠(\)在shell脚本中用来防止特殊字符被提前扩展,这就是所谓的转义
再牛逼的梦想也架不住傻逼似的坚持

浙公网安备 33010602011771号