comando comand linux bash shell grep tr

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.