如何从shell获取准确的命令行字符串?

时间:2014-05-28 15:53:19

标签: shell parsing arguments

我知道$*$@"$@"甚至${1+"@"}及其含义。

我需要从shell脚本访问 EXACT 命令行参数字符串。请注意示例中的引号。像" $ @"保存参数但删除了引号,我不知道如何从中恢复。

示例:

  

./ my-shell.sh" 1 2" 3

我需要检索 EXACT 参数字符串而不进行任何处理:

  

" 1 2" 3

知道如何实现这个目标吗?

2 个答案:

答案 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