comand - tr command linux
Creación de scripts en shell: uso de grep y tr en shebang (1)
Tengo este script en mi sistema:
#! /bin/grep cat
caterpillar
cat
lol
morecat
Cuando lo ejecuto, obtengo el resultado esperado,
#! /bin/grep cat
caterpillar
cat
morecat
Pero, si uso tr en su lugar, con la secuencia de comandos
#! /usr/bin/tr ''a'' ''e''
caterpillar
cat
lol
morecat
Espero obtener
#! /usr/bin/tr ''a'' ''e''
ceterpiller
cet
lol
morecet
Pero, en cambio, no se imprime nada, y si escribo cat
manualmente, obtengo c/t
. ¿Cómo se puede cambiar el guión para que se comporte como el primero?
La línea shebang solo admite un único argumento. Los espacios están incluidos literalmente y no hay citas. Entonces el comando que está ejecutando allí es equivalente a esto desde un shell:
tr "''a'' ''e''"
Si ejecuta eso, verá que tr
queja de la falta de un segundo argumento. Entonces, ¿por qué tu script no se queja? Bueno, ese es el segundo problema. shebang cat
o grep
funciona porque cat
y grep
toman el nombre de un archivo de entrada como argumento, y el shebang agrega el nombre del script a la lista de argumentos. (Esto es necesario para el caso básico de un script #!/bin/sh
que se ejecutará como nombre de script /bin/sh scriptname
)
Por lo tanto, estás corriendo
tr "''a'' ''e''" yourscriptname
que da tr
los 2 argumentos que necesita, y luego lee de stdin, traduciendo de un conjunto de caracteres que no pretendes a otro conjunto de caracteres que no pretendías.
Si la línea shebang tenía un analizador de shell completamente funcional, podrías usar
#!/usr/bin/tr ''a'' ''e'' <
Y el nombre de archivo agregado al final se convertiría en la entrada. Pero shebang es simplemente una cosa simple en el núcleo, no tan funcional.