
Por lo general, cuando uso nombres de archivos dentro de un script, menciono el nombre del archivo explícitamente dentro del script, por ejemplo, como se muestra a continuación:
#!/bin/bash ... echo "<dynamic text>" >> process_log.log ...
Me preguntaba si es posible pasar el nombre del archivo a un script como el siguiente:
./script_name.sh file_1 file_2 file_3
con función de autocompletar de pestañas. (¡Esto sería muy conveniente!)
¿Alguien tiene experiencia con esto? Gracias.
read
es una forma de solicitar algunos datos de entrada, pero creo que es engorroso para entradas múltiples y para textos largos.
Respuesta1
Bien, este script toma un argumento obligatorio y dos argumentos opcionales. Saldrá (con un error) si no especifica al menos un argumento. ¡No hace mucho más que eso!
#!/bin/sh
if [ -z "$1" ]
then
echo "Missing filename: 1"
exit 1
else
file1=$1
fi
file2="$2"
file3="$3"
printf "File 1: %s\n" "$file1"
printf "File 2: %s\n" "$file2"
printf "File 3: %s\n" "$file3"
cat "$file1"
Guárdelo como (por ejemplo) script_name.sh
y configúrelo como ejecutable:
chmod u+x script_name.sh
Luego ejecútelo así:
./script_name.sh script_name.sh script_name.sh script_name.sh
Debería mostrar los tres argumentos que le pasó (que son todos "script_name.sh"), y luego cat
él mismo.
Cuando probé esto, experimenté con la función de completar con pestañas: funcionó bien automáticamente (mostraba archivos y directorios cuando presionaba Tab). No hice nada para que hiciera esto. Sin embargo, si desea que su secuencia de comandos solo funcione con ciertos archivos complete -f -X '!*.png' script_name.sh
, solo mostrará archivos ".png" cuando presione Tab.
Editar para agregar:
complete
no se ejecuta desde el propio script ( script_name.sh
en el ejemplo anterior). Cree un archivo separado ( completion_for_script_name.sh
, por ejemplo):
complete -f -X '!*.png' script_name.sh
Úselo source
para cargar la finalización en el entorno actual:
source ./completion_for_script_name.sh
Normalmente, harías esto en el perfil de tu shell, por ejemplo, .bash_profile
o .bashrc
.