Comparar
echo -n "bar"
con
echo "bar" -n
El primero hace lo que creo que se supone que debe hacer (imprime "barra" sin una nueva línea), mientras que el segundo no. ¿Es esto un error o por diseño? ¿Por qué es diferente de muchos programas cli en que no puedes mover las opciones? Por ejemplo, tail -f /var/log/messageses exactamente lo mismo que tail /var/log/messages -f. A veces hago esto último cuando olvido que quería el primero, porque internamente las opciones y argumentos se reorganizan, generalmente por getopt .
Actualización: sí, originalmente nerf-ed mi pregunta. Eliminé el nerf, tendrás que ver el historial para que algunas de las respuestas tengan sentido.
command-line
xenoterracida
fuente
fuente

echo -n "bar"da "bar", mientrasecho "bar" -nda "bar -n"Respuestas:
Como la mayoría de los demás han observado, "-n" se interpreta literalmente si se coloca en cualquier lugar pero inmediatamente después del
echocomando.Históricamente, las utilidades de UNIX eran así: buscaban opciones solo inmediatamente después del nombre del comando. Probablemente, BSD o GNU fueron los pioneros del estilo más flexible (aunque podría estar equivocado), ya que incluso ahora POSIX especifica la forma antigua como correcta (consulte la Directriz 9, y también
man 3 getopten un sistema Linux). De todos modos, a pesar de que la mayoría de las utilidades de Linux en estos días usan el nuevo estilo, hay algunas reservas comoecho.Echoes un desastre, en cuanto a estándares, en el sentido de que había al menos dos versiones fundamentalmente conflictivas en juego cuando POSIX surgió. Por un lado, tiene el estilo SYSV, que interpreta los caracteres con barra invertida pero trata sus argumentos literalmente, sin aceptar opciones. Por otro lado, tiene un estilo BSD, que trata una inicial-ncomo un caso especial y genera absolutamente todo lo demás literalmente. Y comoechoes tan conveniente, tiene miles de scripts de shell que dependen de un comportamiento u otro:Debido a la semántica de "tratar todo literalmente", es imposible incluso agregar una nueva opción
echosin romper las cosas. Si GNU usara el esquema de opciones flexibles, el infierno se desataría.Por cierto, para una mejor compatibilidad entre las implementaciones de shell Bourne, use en
printflugar deecho.ACTUALIZADO para explicar por qué
echoen particular no utiliza opciones flexibles.fuente
POSIXLY_CORRECTecho, también hay implementaciones que reconocen-eo-Ecomo opciones. Para la portabilidad, no comience con-ni use algo comoprintf %s -e.Las otras respuestas llegan al punto en que puede mirar la página de manual para ver que -n se está convirtiendo en parte de la cadena para hacer eco. Sin embargo, solo quiero señalar que es fácil investigar esto sin el md5sum y hace que lo que está sucediendo sea un poco menos críptico.
fuente
Wow, las explicaciones de todos son largas.
Es así de simple:
-nes una opción si aparece antes de la cadena, de lo contrario es solo otra cadena que se repetirá.Elimine el
| md5sumy verá que la salida es diferente.fuente
Por simple inspección, esto no es un error por diseño ...
Prueba este comando por ti mismo:
Notarás que el md5 resultante es
Acaba de mezclar el uso de -n en eco.
En tu primer código de muestra
-n se usa para decir NO poner una nueva línea después de este eco.
Su segunda muestra
está tratando -n como un texto literal.
fuente