`date` simplemente se expandirá a la salida del date
comando. Sin embargo, elimina los caracteres de espacio extra en los lugares donde hay más de un carácter de espacio consecutivo en la salida. (Esto se debe a que la sustitución del comando está sujeta a la división de palabras y a la forma en que el echo
comando maneja múltiples argumentos).
En "` date` " , las comillas dobles son comillas débiles, por lo que expandirán las variables (intente" $ PWD ") y realice la sustitución de comandos. El resultado de la expansión se pasa como un argumento único al echo
comando, con los espacios consecutivos incluidos: es decir, no se realiza la división de palabras .
En '' fecha`` , las comillas simples son comillas más fuertes, por lo que no permitirán la expansión de variables o la sustitución de comandos dentro de ellas.
Consulte este enlace para obtener más explicaciones.
Editó el primer punto como lo señaló correctamente Michael Suelmann en el comentario a continuación .
Chirag Bhatia - chirag64
fuente
date
comando simple .Ambos
y
mostrará la fecha. El resultado de este último se parece al resultado de ejecutarse
date
por sí mismo.Sin embargo, hay una diferencia: el que está entre
"
comillas"
se enviaráecho
como un argumento único. Las comillas encapsulan la salida de todo el comando como un argumento. Comoecho
solo imprime sus argumentos en orden, con espacios en el medio, básicamente se verá igual.Aquí hay un ejemplo de la sutil diferencia:
produce:
pero:
produce:
Tenga en cuenta que los dos espacios posteriores
Nov
se redujeron a uno sin las comillas. Esto se debe a que el shell analiza cada elemento separado por espacios y envía el resultado a echo como 6 argumentos. Cuando lo cita, echo recibe un solo argumento y las citas retienen el espacio.Esto se vuelve mucho más importante en comandos que no sean echo. Por ejemplo, imagine un comando
foo
que quiere dos argumentos: una fecha y una dirección de correo electrónico.Esto funcionará en ese escenario:
Pero esto confundirá el script enviándole 7 argumentos:
fuente
En los shells POSIX,
`date`
es la antigua forma de sustitución de comandos. La sintaxis moderna es$(date)
.En ambos casos, se expanden a la salida
date
con los caracteres de línea nueva eliminados (siempre que la salida no contenga caracteres NUL).Sin embargo, cuando no está entre comillas dobles y en contextos de lista (por ejemplo, en argumentos a comandos simples como
echo
en su caso), esa expansión está sujeta a:División de palabras : es decir, el "resultado de
date
con los caracteres de línea nueva eliminados" se divide de acuerdo con el valor actual de la$IFS
variable (que por defecto contiene espacio, tabulación y línea nueva (y NUL conzsh
)) en varias palabras .Por ejemplo, si
date
las salidasFri 1 Nov 14:11:15 GMT 2013\n
(como ocurre a menudo en un local Inglés y en una zona horaria británica continental), y$IFS
actualmente contiene:
, que se dividirá en 3 palabras :Fri 1 Nov 14
,11
y15 GMT 2013
.zsh
): es decir, cada palabra que resulta de la división anterior se buscó caracteres comodín (*
,?
,[...]
aunque algunos tienen cáscaras más), y ampliado a la lista de nombres de archivos que coinciden con los patrones. Por ejemplo, si la salidadate
es?%? 33 */*/* UVC 3432
(como es a menudo en lugares de Venus y UVC zona horaria), y$IFS
es el valor predeterminado), a continuación, que se expande a todos los no-oculto 3 nombres de archivo de caracteres en el directorio actual cuyo personaje central es%
,33
, todos los archivos no ocultos en todos los subdirectorios no ocultos de todos los subdirectorios no ocultos del directorio actual,UVC
y3432
.Es por eso que:
$IFS
los caracteres en los que desea dividir.set +f
para deshabilitarlo.Las comillas simples citan todo, por lo que los caracteres de retroceso se toman literalmente.
Ejemplo (el uso
-x
facilita ver lo que está sucediendo):Si la salida contiene caracteres NUL, entonces el comportamiento varía de un shell a otro: algunos los eliminan, otros truncan la salida en el primer carácter NUL, los
zsh
conserva, pero tenga en cuenta que de todos modos los comandos externos no pueden tomar argumentos que contengan NULfuente
Con `fecha` se obtiene la salida de la fecha dividida en varias palabras, porque la división de palabras se realiza después de la sustitución del comando.
Con "` date` "obtienes el resultado de date como una palabra / parámetro ya que hay sustitución de comandos entre comillas dobles, pero el resultado no se analiza más. Lo mismo es válido con una expansión variable como "$ i" en mi ejemplo a continuación.
Con '' fecha '' obtienes una 'fecha' literal ya que no hay sustitución de comando entre comillas simples.
Quizás las diferencias de las 3 formas serán más visibles de esta manera:
fuente