Tomado de la página del manual de FreeBSD en sh (porque es la plataforma en línea más conveniente, la plataforma de destino es Debian si importa):
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 ...]
...
Estoy particularmente interesado en el caso de uso de:
sh [-/+abCEefhIimnPpTuVvx] [-/+o longname] -c string [name [arg ...]]
Ejemplo:
# 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 [email protected]' _ >/var/log/myscript.combined 2>&1 hello world
Noté que el primer argumento no se pasó a myscript
, y la documentación alude a un name
parámetro, en el que no vi una sección de documentación. En mi ejemplo, he agregado el anuncio _
en lugar del argumento del nombre, pero:
¿Qué debo completar para name
? ?
Respuesta aceptada:
La forma:
sh -c '...' name arg1 arg2 ...
se llama script en línea, a menudo se ve en combinación con find ... -exec sh -c '...' find-sh {} +
. Dentro del script en línea, $0
se establecerá en name
, y el resto de los argumentos se completaron con [email protected]
.
En general, debe configurarlo en algo significativo, porque se usará, por ejemplo, para mostrar mensajes de error:
sh -c 'echo "${1?}"' foo
foo: 1: foo: 1: parameter not set
Pero puedes configurar name
a cualquier palabra que desee, para indicar el nombre del script en línea:
sh -c 'printf "%sn" "$0"' custom-sh 1 2 3
custom-sh
Este comportamiento está definido por POSIX.