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/messages
es 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" -n
da "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
echo
comando.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 getopt
en 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
.Echo
es 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-n
como un caso especial y genera absolutamente todo lo demás literalmente. Y comoecho
es 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
echo
sin 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
printf
lugar deecho
.ACTUALIZADO para explicar por qué
echo
en particular no utiliza opciones flexibles.fuente
POSIXLY_CORRECT
echo
, también hay implementaciones que reconocen-e
o-E
como 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:
-n
es una opción si aparece antes de la cadena, de lo contrario es solo otra cadena que se repetirá.Elimine el
| md5sum
y 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