Qual é o argumento 'name' para 'sh -c'?

4

Extraído da página de manual do FreeBSD no sh (porque é a plataforma de destino online mais conveniente é Debian se for importante):

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 ...]
...

Estou particularmente interessado no caso de uso de:

sh [-/+abCEefhIimnPpTuVvx] [-/+o longname] -c string [name [arg ...]]

Exemplo:

# 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

Eu notei que o primeiro aumento não foi passado para o myscript, e verificar a documentação alude a um parâmetro name , no qual eu não vi uma seção doc. No meu exemplo, adicionei ad _ no lugar do argumento name, mas:

O que devo preencher para name ?

    
por ThorSummoner 02.09.2015 / 01:59

2 respostas

5

A página man no Linux foi detalhada um pouco.

sh -c [-aCefnuvxIimqVEb] [+aCefnuvxIimqVEb] [-o option_name] [+o option_name] command_string [command_name [argument ...]]

-c Read commands from the command_string operand instead of from the standard input. Special parameter 0 will be set from the command_name operand and the positional parameters ($1, $2, etc.) set from the remaining argument operands.

command_name A string assigned to special parameter 0 when executing the commands in command_string. If command_name is not specified, special parameter 0 shall be set to the value of the first argument passed to sh from its parent (for example, argv[0] for a C program), which is normally a pathname used to execute the sh utility.

    
por 02.09.2015 / 02:08
5

O formulário:

sh -c '...' name arg1 arg2 ...

é chamado de script embutido, geralmente visto em combinação com find ... -exec sh -c '...' find-sh {} + . Dentro do script embutido, $0 será definido como name e o restante dos argumentos foi preenchido com $@ .

Em geral, você deve configurá-lo para algo significativo, porque ele será usado, por exemplo, para exibir mensagens de erro:

sh -c 'echo "${1?}"' foo
foo: 1: foo: 1: parameter not set

Mas você pode definir name para qualquer palavra que desejar, para indicar o nome do script embutido:

sh -c 'printf "%s\n" "$0"' custom-sh 1 2 3
custom-sh

Esse comportamento é definido por POSIX .

    
por 02.09.2015 / 02:43