我知道$*
,$@
,"$@"
甚至${1+"@"}
及其含义。
我需要从shell脚本访问 EXACT 命令行参数字符串。请注意示例中的引号。像" $ @"保存参数但删除了引号,我不知道如何从中恢复。
示例:
./ my-shell.sh" 1 2" 3
我需要检索 EXACT 参数字符串而不进行任何处理:
" 1 2" 3
知道如何实现这个目标吗?
答案 0 :(得分:10)
在bash
中,您可以从shell历史记录中获取此信息:
set -o history
shopt -s expand_aliases
function myhack {
line=$(history 1)
line=${line#*[0-9] }
echo "You wrote: $line"
}
alias myhack='myhack #'
哪种方法可以解释:
$ myhack --args="stuff" * {1..10} $PATH
You wrote: myhack --args="stuff" * {1..10} $PATH
此外,这是一个方便的图表:
答案 1 :(得分:0)
但是我需要精确地再现用户输入的命令行,以便在发生故障时能够以编程方式重新执行
您不需要确切的命令行;您可以自己重建等效的(即使不完全相同!)shell命令。
#!/usr/bin/env bash
printf -v cmd_q '%q ' "$@"
echo "Executed with a command identical to: $cmd_q"
...尽管您甚至不需要 ,因为"$@"
可以按原样重新执行,而无需知道启动它的命令是什么:
#!/usr/bin/env bash
printf "Program is starting; received command line equivalent to: "
printf '%q ' "$@"
printf '\n'
if [[ ! $already_restarted ]]; then
echo "About to restart ourselves:
exec "$@" # restart the program
fi