从 shell 脚本获取完整命令
Get full command from shell script
我正在寻找一种从 shell 脚本访问完整命令的方法,例如
假设我有一个名为 test.sh 的脚本。当我运行它时,命令行按原样传递给 ruby(除了删除脚本本身)。
$ test.sh print ENV['HOME']
相当于
$ ruby -e "print ENV['HOME']"
当你 运行:
test.sh print ENV['HOME']
...然后,before test.sh
开始,shell 运行s 字符串拆分、扩展和类似过程.因此,最终 运行 是(假设没有全局扩展):
execvp("test.sh", {"test.sh", "print", "ENV[HOME]"});
如果在当前目录中有一个名为 ENVH
的文件,shell 可能会将 ENV['HOME']
视为一个 glob,通过用文件名替换 glob 表达式来扩展它,并且因此 运行ning:
execvp("test.sh", {"test.sh", "print", "ENVH"});
...无论如何,execv*
系列对 运行 的调用另一端存在的新程序没有原始 [=46] 的本地信息=]——因此在解析和扩展之前无法知道原始命令是什么。 因此,除非修改外部 shell 以带外公开它(如通过环境变量),否则无法检索原始字符串。
这就是为什么您的调用约定应该要求:
test.sh "print ENV['HOME']"
或者,允许从 shell quoting/escaping 语法中获得更多自由,通过标准输入传递程序文本,如:
test.sh <<'EOF'
print ENV['HOME']
EOF
现在,如果您想修改 shell 来做到这一点,我建议您使用公开 BASH_COMMAND
的函数。例如:
shopt -s extdebug
expose_command() {
export SHELL_COMMAND="$BASH_COMMAND"
return 0
}
trap expose_command DEBUG
...那么,在test.sh
里面,可以参考SHELL_COMMAND
。然而,再次重申:这仅在调用 shell 配置了该陷阱时才有效,如在用户的 ~/.bashrc
中;您不能简单地将上述内容放在脚本中并期望它起作用,因为只有交互式 shell —— 脚本的父进程 —— 可以访问此信息并因此能够公开它。
我正在寻找一种从 shell 脚本访问完整命令的方法,例如
假设我有一个名为 test.sh 的脚本。当我运行它时,命令行按原样传递给 ruby(除了删除脚本本身)。
$ test.sh print ENV['HOME']
相当于
$ ruby -e "print ENV['HOME']"
当你 运行:
test.sh print ENV['HOME']
...然后,before test.sh
开始,shell 运行s 字符串拆分、扩展和类似过程.因此,最终 运行 是(假设没有全局扩展):
execvp("test.sh", {"test.sh", "print", "ENV[HOME]"});
如果在当前目录中有一个名为 ENVH
的文件,shell 可能会将 ENV['HOME']
视为一个 glob,通过用文件名替换 glob 表达式来扩展它,并且因此 运行ning:
execvp("test.sh", {"test.sh", "print", "ENVH"});
...无论如何,execv*
系列对 运行 的调用另一端存在的新程序没有原始 [=46] 的本地信息=]——因此在解析和扩展之前无法知道原始命令是什么。 因此,除非修改外部 shell 以带外公开它(如通过环境变量),否则无法检索原始字符串。
这就是为什么您的调用约定应该要求:
test.sh "print ENV['HOME']"
或者,允许从 shell quoting/escaping 语法中获得更多自由,通过标准输入传递程序文本,如:
test.sh <<'EOF'
print ENV['HOME']
EOF
现在,如果您想修改 shell 来做到这一点,我建议您使用公开 BASH_COMMAND
的函数。例如:
shopt -s extdebug
expose_command() {
export SHELL_COMMAND="$BASH_COMMAND"
return 0
}
trap expose_command DEBUG
...那么,在test.sh
里面,可以参考SHELL_COMMAND
。然而,再次重申:这仅在调用 shell 配置了该陷阱时才有效,如在用户的 ~/.bashrc
中;您不能简单地将上述内容放在脚本中并期望它起作用,因为只有交互式 shell —— 脚本的父进程 —— 可以访问此信息并因此能够公开它。