作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个 BASH 脚本,它有一组很长的参数和两种调用方式:
my_script --option1 value --option2 value ... etc
my_script val1 val2 val3 ..... valn
最佳答案
您可以尝试以下操作:
myInvocation="$(printf %q "$BASH_SOURCE")$((($#)) && printf ' %q' "$@")"
$BASH_SOURCE
指正在运行的脚本(如调用),和
$@
是参数数组;
(($#)) &&
确保以下
printf
仅当至少传递 1 个参数时才执行命令;
printf %q
解释如下。
my_script $USER "$(date +%s)"
, $myInvocation
不会按原样反射(reflect)这些参数,而是包含 shell 将它们扩展到的内容;例如,my_script jdoe 1460644812
printf %q
对于保留参数之间的边界至关重要 - 如果您的原始参数嵌入了空格,例如
$0 $*
将导致不同的命令。
printf %q
还可以防止嵌入参数中的其他 shell 元字符(例如,
|
)。
printf %q
引用给定的参数作为 shell 命令中的单个参数重用,应用必要的引用;例如。:
$ printf %q 'a |b'
a\ \|b
a\ \|b
相当于单引号字符串
'a |b'
从 shell 的角度来看,但此示例显示了结果表示如何不一定与输入表示相同。
ksh
和
zsh
也支持
printf %q
, 和
ksh
实际输出
'a |b'
在这种情况下。
$BASH_COMMAND
作为额外的参数 :
$BASH_COMMAND
包含
原始[1]my_script "$BASH_COMMAND" --option1 value --option2
# The *first* argument is what "$BASH_COMMAND" expanded to,
# i.e., the entire (alias-expanded) command line.
myInvocation=$1 # Save the command line in a variable...
shift # ... and remove it from "$@".
# Now process "$@", as you normally would.
$BASH_COMMAND
的传递如下:alias my_script='/path/to/my_script "$BASH_COMMAND"'
# The *first* argument is what "$BASH_COMMAND" expanded to,
# i.e., the entire (alias-expanded) command line.
# Here we also re-transform the alias-expanded command line to
# its original aliased form, by replacing everything up to and including
# "$BASH_COMMMAND" with the alias name.
myInvocation=$(sed 's/^.* "\$BASH_COMMAND"/my_script/' <<<"$1")
shift # Remove the first argument from "$@".
# Now process "$@", as you normally would.
$BASH_COMMAND
真正只报告当前命令的命令行,在脚本或函数包装器的情况下,它将是该包装器内的行。
$BASH_COMMAND
中看到底层脚本。 ,但这通常是可取的,因为别名是特定于用户的。
<(...)
按原样反射(reflect)。
关于linux - 如何从脚本内部获取 BASH 脚本的完整调用命令(不仅仅是参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36625593/
我是一名优秀的程序员,十分优秀!