“sh -c”的“name”参数有什么用?

“sh -c”的“name”参数有什么用?

取自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 实用程序的路径名。

相关内容