取自FreeBSD 的手册页在 sh 上(因为它是最方便的在线方式,如果重要的话,目标平台是 Debian):
SH(1) FreeBSD General Commands Manual SH(1)
NAME
sh -- command interpreter (shell)
SYNOPSIS
sh [-/+abCEefhIimnPpTuVvx] [-/+o longname] [script [arg ...]]
sh [-/+abCEefhIimnPpTuVvx] [-/+o longname] -c string [name [arg ...]]
sh [-/+abCEefhIimnPpTuVvx] [-/+o longname] -s [arg ...]
...
我对以下用例特别感兴趣:
sh [-/+abCEefhIimnPpTuVvx] [-/+o longname] -c string [name [arg ...]]
例子:
# Normal:
myscript hello world
myscript hello world >/var/log/myscript.combined 2>&1
# Constrained:
# - Arguments 'hello' and 'world' are suffixed by calling program.
myscript >/var/log/myscript.combined 2>&1 hello world
# Constrained Further:
# - Wrapped in `sh` to catch system messages, like Segmentation Fault
sh -c 'myscript $@' _ >/var/log/myscript.combined 2>&1 hello world
我注意到第一个参数没有传递给myscript
,并且文档暗示了一个name
参数,我没有看到文档部分。在我的示例中,我添加了 ad_
来代替 name 参数,但是:
我应该填写什么name
?
答案1
表格:
sh -c '...' name arg1 arg2 ...
称为内联脚本,通常与find ... -exec sh -c '...' find-sh {} +
.在 inline-script 中,$0
将被设置为name
,其余参数被填充为$@
。
一般来说,您应该将其设置为有意义的内容,因为它将用于显示错误消息:
sh -c 'echo "${1?}"' foo
foo: 1: foo: 1: parameter not set
但你可以设置name
为任何你喜欢的单词,以指示内联脚本的名称:
sh -c 'printf "%s\n" "$0"' custom-sh 1 2 3
custom-sh
此行为定义为POSIX。
答案2
Linux 的手册页非常详细。
sh -c [-aCefnuvxIimqVEb] [+aCefnuvxIimqVEb] [-o 选项名称] [+o 选项名称] 命令字符串 [命令名称 [参数 ...]]
-C 从 command_string 操作数而不是从标准输入读取命令。特殊参数 0 将从 command_name 操作数设置,位置参数($1、$2 等)从其余参数操作数设置。
命令名执行command_string中的命令时分配给特殊参数0的字符串。如果未指定 command_name,则特殊参数 0 应设置为从其父级传递给 sh 的第一个参数的值(例如,对于 C 程序为 argv[0]),该值通常是用于执行 sh 实用程序的路径名。