Para complementar las respuestas existentes y útiles; punta del sombrero a QZ Support por alentarme a publicar una respuesta por separado:
Aquí entran en juego dos mecanismos distintos :
(a) si cut
en sí requiere el delimitador (espacio, en este caso) se pasa a la -d
opción de ser un argumento separado o si es aceptable para añadirlo directamente a -d
.
(b) cómo el shell generalmente analiza los argumentos antes de pasarlos al comando que se invoca.
(a) se responde con una cita de las directrices POSIX para servicios públicos (énfasis mío)
Si la SINOPSIS de una utilidad estándar muestra una opción con un argumento de opción obligatorio, una [...] aplicación conforme utilizará argumentos separados para esa opción y su argumento de opción . Sin embargo , una implementación conforme también permitirá que las aplicaciones especifiquen la opción y el argumento de la opción en la misma cadena de argumento sin caracteres intermedios .
En otras palabras: en este caso, como -d
el argumento de opción es obligatorio , puede elegir si desea especificar el delimitador como :
- (s) CUALQUIERA: un argumento separado
- (d) OR: como un valor directamente asociado a
-d
.
Una vez que haya elegido (s) o (d), lo que importa es el análisis literal de cadena del shell - (b):
Con enfoque (s) , todas las siguientes formas son EQUIVALENTES:
-d ' '
-d " "
-d \<space> # <space> used to represent an actual space for technical reasons
Con el enfoque (d) , todas las siguientes formas son EQUIVALENTES:
-d' '
-d" "
"-d "
'-d '
d\<space>
La equivalencia se explica por el procesamiento literal de cadena del shell :
Todas las soluciones anteriores dan como resultado la misma cadena (en cada grupo) cuando las cut
ve :
(s) : cut
ve -d
, como su propio argumento, seguido de un argumento separado que contiene un carácter espacial, ¡sin comillas ni \
prefijo!
(d) : cut
ve -d
más un carácter espacial, ¡sin comillas ni \
prefijo! - Como parte del mismo argumento.
La razón por la cual los formularios en los respectivos grupos son en última instancia idénticos es doble, en función de cómo el shell analiza los literales de cadena :
- El shell permite que el literal se especifique tal cual es a través de un mecanismo llamado cita , que puede tomar varias formas :
- cadenas de comillas simples : el contenido dentro
'...'
se toma literalmente y forma un argumento único
- cadenas de doble comillas : el contenido dentro
"..."
también forma un argumento único , pero está sujeto a interpolación (expande referencias variables como $var
sustituciones de comandos ( $(...)
o `...`
) o expansiones aritméticas ( $(( ... ))
).
\
-comillas de caracteres individuales : un carácter \
precedente a un solo carácter hace que ese carácter se interprete como un literal.
- Citando se complementa con eliminación de comillas , lo que significa que una vez que la envoltura ha analizado una línea de comando, que elimina los caracteres cita de los argumentos (que encierran
'...'
o "..."
o \
instancias) - por lo tanto, el ser de comandos invoca nunca ve los caracteres de comillas .