如何准确记录bash参数?

时间:2015-02-25 15:12:44

标签: bash

我一直在寻找半小时徒劳!

这看起来很简单:

#!/bin/bash
#test.sh
echo "$0 $@">>my.log

运行命令:

test.sh -a -b 'abc -c 123'
test.sh -a -b "abc -c 123"

输出:

cat my.log
test.sh -a -b abc -c 123
test.sh -a -b abc -c 123

预期产出:

cat my.log
test.sh -a -b 'abc -c 123' 
test.sh -a -b "abc -c 123"

注意预期输出中的单引号。

如何获得预期输出,是否必须手动输入引号?

目的是:我想记录如何调用脚本以便稍后追溯我的工作方式。所以日志行必须保持命令的调用方式,我可以复制粘贴并再次运行它。

经过多次搜索和试验,所有带引号的技巧都会逃脱,并且printf无法正常工作。像其他人提到的那样,这似乎是Bash在解析参数中的内置行为,它剥离了引号。我只是想知道是否有可能从bash history中选择一行,它准确记录了如何调用命令。

5 个答案:

答案 0 :(得分:1)

只需引用您发送的参数:

$ ./a "-a -b 'abc -c 123'"
$ ./a '-a -b "abc -c 123"'

输出是......

$ cat my.log 
./a -a -b 'abc -c 123'
./a -a -b "abc -c 123"

答案 1 :(得分:1)

这不能得到确切的(报价引用)输出以匹配您的输入,但我相信它确实可以获得功能相同的输出。

$ cat test.sh
#!/bin/bash
printf -- '%q' "$0"; printf -- ' %q' "$@"; echo
$ ./test.sh -a -b 'abc -c 123'
./test.sh -a -b abc\ -c\ 123
$ ./test.sh '-a 555' "-b 6 7 8" abc\ -c\ 123
./test.sh -a\ 555 -b\ 6\ 7\ 8 abc\ -c\ 123

我相信这是你能得到的最接近你想要的东西。当脚本看到参数时,原始引号(或转义)就消失了。 无法完全重现它们。

答案 2 :(得分:0)

如果你想要脚本中的引号,你也可以使用反斜杠转义引号。

test.sh -a -b \'abc -c 123\'
test.sh -a -b \"abc -c 123\"

答案 3 :(得分:0)

迭代他们:

#!/bin/bash
echo -n "$0 "
for arg in "$@"; do echo -n "'$arg' "; done
echo

这会让你:

./test.sh '-a' '-b' 'abc -c 123'
for
./test.sh -a -b 'abc -c 123'

这很简单,但不会处理带有单引号的参数(例如"don't"),但它会处理这些空格,包括可执行文件名称中的空格。

您无法获得原始引号。它们不会发送到目标脚本。该信息在调用期间是最后一次。发送的是bash解释的参数(在扩展globs和转义序列之后)。引用你必须自己做 - 单引号处理最常见的情况。

答案 4 :(得分:0)

除此之外不要了解其他方式:

test.sh -a -b \'abc -c 123\'
test.sh -a -b \"abc -c 123\"