如果我有脚本subtest.sh:
#! /bin/sh
echo "subtest arguments: $@"
variable=${1?"You must provide variable!"}
echo "$variable"
...通过脚本test.sh调用:
#! /bin/sh
echo "test arguments: $@"
variable=$1
sudo -u $USER -s ./subtest.sh "$variable"
这适用于大多数输入字符串。例如:
$ ./test.sh 'abc def'
test arguments: abc def
subtest arguments: abc def
abc def
但是,当输入字符串中有美元符号时,它会中断!
$ ./test.sh 'abc$def'
test arguments: abc$def
subtest arguments: abc
abc
如何正确引用我的变量,使其在另一侧始终不变?
我尝试了各种各样的技巧(例如"'$variable'"
,$(printf '%q' "$variable")
但是如果我设置SHELL=echo
我可以看到它们都被挫败了:引号本身会被转义,例如用户输入中的$
总是由shell解释!
答案 0 :(得分:0)
原来这与通常的shell变量处理嫌疑无关。相反,事实证明这只是sudo
本身的故意!
在其parse_args.c:566的镜像中找到了这个逻辑:
/* quote potential meta characters */
if (!isalnum((unsigned char)*src) && *src != '_' && *src != '-' && *src != '$')
*dst++ = '\\';
美元符号明确列入白名单,赢得被转义!但是我要做的所有事情都是为了逃避美元符号自己逃脱......
据我所知,唯一的办法是避免触发-s
模式。它适用于普通sudo -u $USER ./subtest.sh "$variable"
,所以现在我想要记住为什么我[以为我?]首先需要-s
: - /