Considerar
echo \ # this is a comment
foo
Esto da:
$ sh foo.sh
# this is a comment
foo.sh: line 2: foo: command not found
Después de buscar en la web, encontré una solución de DigitalRoss en el sitio hermano Stack Overflow. Entonces uno puede hacer
echo `: this is a comment` \
foo
o alternativamente
echo $(: this is a comment) \
foo
Sin embargo, DigitalRoss no explicó por qué funcionan estas soluciones. Agradecería una explicación. Él respondió con un comentario:
Solía haber un
goto
comando de shell que se bifurcaba a las etiquetas especificadas como:
aquí. Segoto
ha ido, pero aún puede usar la: whatever
sintaxis ...:
es una especie de comentario analizado ahora.
Pero me gustaría obtener más detalles y contexto, incluida una discusión sobre la portabilidad.
Por supuesto, si alguien tiene otras soluciones, eso también sería bueno.
Consulte también la pregunta anterior ¿ Cómo comentar comandos de varias líneas en scripts de shell? .
Lleve a casa el mensaje de la discusión a continuación. El `: this is a comment`
es solo una sustitución de comando. La salida de : this is a comment
no es nada, y eso se pone en lugar de `: this is a comment`
.
Una mejor opción es la siguiente:
echo `# this is a comment` \
foo
make_FIND
un script rápido que crea una larga lista de argumentos parafind
. Aquí, la motivación para construirlo fragmento por fragmento es que cada fragmento proviene del cuerpo de un bucle, pero el mismo estilo permite comentar cada fragmento.Puede lograr esto utilizando matrices Bash, por ejemplo
Esto define una matriz
$CMD
y luego la expande. Una vez expandida, se evalúa la línea resultante, por lo que en este casoecho foo
se ejecuta.El texto entre
(
y)
define la matriz y está sujeto a la sintaxis bash habitual, por lo que#
se ignora todo en una línea posterior .Nota sobre la preservación de espacios en blanco entre comillas
${CMD[@]}
se expande a una sola cadena que es la concatenación de todos los elementos, separados por un espacio. Una vez expandido, Bash analizaría la cadena en tokens de la manera habitual (cf $ IFS ), que a menudo no es lo que queremos.Por el contrario, si la expansión se envuelve entre comillas dobles, es decir
"${CMD[@]}"
, cada elemento de la matriz se conserva. Considere la diferencia entrehello world second item
y"hello world" "second item"
.Ejemplo ilustrativo:
fuente
${CMD[@]}
no se expande a una sola cadena. - Se expande a muchas cadenas: no solo se divide para cada elemento de la matriz, sino también en espacios en blanco en cada elemento. (Es decir: completamente inútil)No lo haga
$(: comment)
. Eso no es un comentario, es un subshell, otro proceso de shell completamente nuevo para la mayoría de los shells. Su objetivo es hacer menos con su aporte, no más, que es lo que eso haría, incluso si no tiene sentido.En cambio, puedes hacer ...
Básicamente lo que está sucediendo allí es que el shell está haciendo una sustitución. Sustituye el valor del parámetro de shell especial
$-
dos veces cada vez. De todos modos, es una cadena corta, pero siempre está configurada, por lo que la sustitución interna, que se interpreta como un patrón para quitar desde el exterior, no se expande al contenido entre paréntesis cuando uso la-
forma de expansión.Aquí:
¿Ver? Entonces se expandió dos veces. Tan pronto como el shell encuentra que el parámetro se establece, todo en el campo de expansión opcional se descarta, más o menos, y se expande a su valor completo que se elimina de sí mismo y, por lo tanto, a nada en absoluto. En la mayoría de los shells ni siquiera necesita escapar de las comillas, sino que lo
bash
requiere.Mejor aún es:
fuente