【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脚本中用来防止特殊字符被提前扩展,这就是所谓的转义
再牛逼的梦想也架不住傻逼似的坚持