`date` será expandido apenas para a saída do date
comando. No entanto, ele remove caracteres de espaço extra em locais onde há mais de um caractere de espaço consecutivo na saída. (Isso ocorre porque a substituição do comando está sujeita à divisão de palavras e devido à maneira como o echo
comando lida com vários argumentos.)
Em "` date` " , as aspas duplas são aspas fracas; portanto, elas expandem variáveis (tente" $ PWD ") e executam a substituição de comandos. O resultado da expansão é passado como um único argumento para o echo
comando, com espaços consecutivos incluídos: ou seja, a divisão de palavras não é executada.
Em `` data '' , as aspas simples são aspas mais fortes, portanto, não permitirão a expansão de variáveis ou a substituição de comandos dentro delas.
Consulte este link para obter mais explicações.
Editou o primeiro ponto como apontado corretamente por Michael Suelmann no comentário abaixo .
Chirag Bhatia - chirag64
fonte
date
comando bare .Ambos
e
exibirá a data. A saída deste último parece com a saída sendo executada
date
por si só.Porém, há uma diferença: a pessoa entre
"
aspas"
será enviada paraecho
como um único argumento. As aspas encapsulam a saída de todo o comando como um argumento. Comoecho
apenas imprime seus argumentos em ordem, com espaços no meio, basicamente parecerá o mesmo.Aqui está um exemplo da diferença sutil:
produz:
mas:
produz:
Observe que os dois espaços seguintes
Nov
foram reduzidos a um sem as aspas. Isso ocorre porque o shell está analisando cada elemento separado por espaço e enviando o resultado para ecoar como 6 argumentos. Quando você cita, o eco recebe um único argumento e as aspas retêm o espaço.Isso se torna muito mais importante em comandos que não sejam eco. Por exemplo, imagine um comando
foo
que queira dois argumentos: uma data e um endereço de email.Isso funcionará nesse cenário:
Mas isso confundirá o script enviando-o 7 argumentos:
fonte
Nos shells POSIX,
`date`
é a forma antiga de substituição de comando. A sintaxe moderna é$(date)
.Nos dois casos, eles se expandem para a saída
date
com os caracteres de nova linha à direita removidos (desde que a saída não contenha caracteres NUL).No entanto, quando não estiver entre aspas duplas e em contextos de lista (por exemplo, em argumentos para comandos simples, como
echo
no seu caso), essa expansão estará sujeita a:Divisão de palavras : ou seja, a "saída de
date
com os caracteres de nova linha à direita removidos" é dividida de acordo com o valor atual da$IFS
variável (por padrão, contendo espaço, tabulação e nova linha (e NUL comzsh
)) em várias palavras .Por exemplo, se
date
as saídasFri 1 Nov 14:11:15 GMT 2013\n
(como costuma acontecer em um local Inglês e em um fuso horário britânico continente), e$IFS
atualmente contém:
, que será dividido em 3 palavras :Fri 1 Nov 14
,11
e15 GMT 2013
.zsh
): isto é, cada palavra resultante da divisão acima é procurado caracteres curinga (*
,?
,[...]
embora algumas conchas têm mais), e expandiu-se para a lista de nomes de arquivos que correspondem a esses padrões. Por exemplo, se a saídadate
é?%? 33 */*/* UVC 3432
(como muitas vezes é em locais venusianos e fuso horário UVC), e$IFS
é o valor padrão), em seguida, que se expande para todos os não-escondida 3 nomes de personagens no diretório atual cujo personagem central é%
,33
, todos os arquivos não ocultos em todos os subdiretórios não ocultos de todos os subdiretórios não ocultos do diretório atualUVC
e3432
.É por isso que:
$IFS
os caracteres nos quais deseja dividir.set +f
para desativá-lo.As aspas simples citam tudo, fazendo com que os caracteres do backtick sejam interpretados literalmente.
Exemplo (o uso
-x
facilita a visualização do que está acontecendo):Se a saída contiver caracteres NUL, o comportamento varia de shell para shell: alguns os removem, outros truncam a saída no primeiro caractere NUL,
zsh
preservam-nos, mas observe que de qualquer maneira os comandos externos não podem aceitar argumentos que contenham NULsfonte
Com `date ', você obtém a saída da data dividida em várias palavras, porque a divisão da palavra é feita após a substituição do comando.
Com "` date` ", você obtém a saída da data como uma palavra / parâmetro, pois há substituição de comando entre aspas duplas, mas a saída não é mais analisada. O mesmo é válido com expansão variável como "$ i" no meu exemplo abaixo.
Com '`date' ', você obtém uma` date' literal, pois não há substituição de comando entre aspas simples.
Talvez as diferenças das três formas sejam mais visíveis desta maneira:
fonte