Para complementar as respostas úteis existentes; dica do suporte ao QZ por me incentivar a postar uma resposta separada:
Dois mecanismos distintos entram em jogo aqui:
(a) se cut
ele próprio exige que o delimitador (espaço, neste caso) passado para a -d
opção seja um argumento separado ou se é aceitável anexá-lo diretamente a -d
.
(b) como o shell geralmente analisa argumentos antes de passá-los para o comando que está sendo chamado.
(a) é respondida por uma citação das diretrizes POSIX para utilidades (ênfase minha)
Se a SINOPSE de um utilitário padrão mostra uma opção com um argumento-opção obrigatório , [...] um aplicativo em conformidade deve usar argumentos separados para essa opção e seu argumento-opção . No entanto , uma implementação em conformidade também deve permitir que os aplicativos especifiquem a opção e o argumento da opção na mesma sequência de argumentos sem caracteres intervenientes .
Em outras palavras: nesse caso, como -d
o argumento de opção é obrigatório , você pode escolher se deseja especificar o delimitador como :
- (s) OUTROS: um argumento separado
- (d) OU: como um valor diretamente associado a
-d
.
Depois que você escolhe (s) ou (d), é a análise literal de cadeia do shell - (b) - que importa:
Com abordagem (s) , todas as seguintes formas são equivalentes:
-d ' '
-d " "
-d \<space> # <space> used to represent an actual space for technical reasons
Com a abordagem (d) , todas as seguintes formas são EQUIVALENTES:
-d' '
-d" "
"-d "
'-d '
d\<space>
A equivalência é explicada pelo processamento literal de cadeia do shell :
Todas as soluções acima resultam na mesma sequência exata (em cada grupo) quando as cut
vê :
(s) : cut
vê -d
, como seu próprio argumento, seguido por um argumento separado que contém um caractere de espaço - sem aspas ou \
prefixo !.
(d) : cut
vê -d
mais um caractere de espaço - sem aspas ou \
prefixo! - como parte do mesmo argumento.
A razão pela qual os formulários nos respectivos grupos são basicamente idênticos é dupla, com base em como o shell analisa literais de strings :
- O shell permite que o literal seja especificado como é através de um mecanismo chamado de citação , que pode assumir várias formas :
- strings entre aspas simples : o conteúdo interno
'...'
é tomado literalmente e forma um único argumento
- strings com aspas duplas : o conteúdo dentro
"..."
também forma um argumento único , mas está sujeito a interpolação (expande referências variáveis, como $var
substituições de comandos ( $(...)
ou `...`
) ou expansões aritméticas ( $(( ... ))
)).
\
-citação de caracteres individuais : um caractere\
anterior a um único faz com que esse caractere seja interpretado como um literal.
- Citando é complementado por remoção de citação , o que significa que uma vez que a casca tem analisado uma linha de comando, ele remove os caracteres de citação dos argumentos (que encerram
'...'
ou "..."
ou \
instâncias) - assim, o ser comando invocado nunca vê as aspas .