Tengo un caso muy extraño... Si ejecuto un script con /bin/bash, no puede reconocer los alias que configuré ni siquiera dentro del script. Y lo más extraño es
$ cat -n test.sh
1 #!/bin/bash
2 alias somecommand='ls -alF'
3 alias
4 somecommand
$ ./test.sh
alias somecommand='ls -alF'
./test.sh: line 4: somecommand: command not found
... como se muestra arriba, si ejecuto el comando "alias" en el script resulta que bash ha tomadoalgún comandoen los alias, pero si ejecuto elalgún comando¡Aun así no será reconocido!
Todo está bien si uso el comando "sh" para ejecutar el script... entonces, ¿es un error de bash? ¿O hay algo que me falta?
¡Cualquier ayuda es apreciada!
Respuesta1
simplemente no lo hagasusaralias en guiones. No tiene mucho sentido utilizar una función diseñada para uso interactivo en scripts. En su lugar, utilice funciones:
somecommand () {
ls -alF
}
Las funciones son mucho más flexibles que los alias. Lo siguiente sobrecargaría lo habitual ls
con una versión que siempre lo hace ls -F
(los argumentos se pasan en $@
, incluidos los indicadores que use), más o menos como alias ls="ls -F"
lo haría el alias:
ls () {
command ls -F "$@"
}
Aquí command
evita que el shell entre en una recursividad infinita, lo que de otro modo haría ya que la función también se llama ls
.
Un alias nunca podría hacer algo como esto:
select_edit () (
dir=${1:-.}
if [ ! -d "$dir" ]; then
echo 'Not a directory' >&2
return 1
fi
shopt -s dotglob nullglob
set --
for name in "$dir"/*; do
[ -f "$name" ] && set -- "$@" "$name"
done
select file in "$@"; do
"${EDITOR:-vi}" "$file"
break
done
)
Esto crea la función select_edit
que toma el directorio como argumento y le pide al usuario que elija un archivo en ese directorio. El archivo seleccionado se abrirá en un editor para editarlo.
El bash
manual contiene la declaración.
Para casi todos los propósitos, los alias son reemplazados por funciones de shell.
Respuesta2
Para utilizar funciones interactivas como alias dentro de un script bash, debe ejecutarlo en un shell bash interactivo. Para eso, cambie la primera línea para incluir un archivo -i
. Entonces su nuevo archivo de script se convierte
#!/bin/bash -i
alias somecommand='ls -alF'
alias
somecommand
Respuesta3
Una especie de duplicado deuna pregunta previasin embargo, las respuestas son un poco prolijas. La respuesta corta es que, por razones ocultas, por defecto bash no mira los alias definidos dentro de los scripts. Debe indicarle explícitamente que lo haga mediante una shopt -s expand_aliases
línea en la parte superior de dicho script. Haz eso y luego tu script encontraráalgún comando.
Respuesta4
Utilice shopt -sq expand_aliases
, por ejemplo, este código en codificación UTF-8:
#!/bin/bash
function запрещать() {
if [ $1 -eq 3 ]
then
echo -n "Запрещено. Код ошибки: "
echo `expr 2 \* 3 \* 47`
else
echo -n "."
запрещать `expr $1 + 1`
fi
}
#function запретить() {
# запрещать 1
#}
shopt -sq expand_aliases
alias запретить='запрещать 1'
запретить