`date` simplemente se expandirá a la salida del datecomando. 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 echocomando 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 echocomando, 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
datecomando simple .Ambos
y
mostrará la fecha. El resultado de este último se parece al resultado de ejecutarse
datepor sí mismo.Sin embargo, hay una diferencia: el que está entre
"comillas"se enviaráechocomo un argumento único. Las comillas encapsulan la salida de todo el comando como un argumento. Comoechosolo 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
Novse 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
fooque 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
datecon 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
echoen su caso), esa expansión está sujeta a:División de palabras : es decir, el "resultado de
datecon los caracteres de línea nueva eliminados" se divide de acuerdo con el valor actual de la$IFSvariable (que por defecto contiene espacio, tabulación y línea nueva (y NUL conzsh)) en varias palabras .Por ejemplo, si
datelas 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$IFSactualmente contiene:, que se dividirá en 3 palabras :Fri 1 Nov 14,11y15 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 salidadatees?%? 33 */*/* UVC 3432(como es a menudo en lugares de Venus y UVC zona horaria), y$IFSes 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,UVCy3432.Es por eso que:
$IFSlos caracteres en los que desea dividir.set +fpara deshabilitarlo.Las comillas simples citan todo, por lo que los caracteres de retroceso se toman literalmente.
Ejemplo (el uso
-xfacilita 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
zshconserva, 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