¡No puedo usar alias en el script, incluso si lo defino justo arriba!

¡No puedo usar alias en el script, incluso si lo defino justo arriba!

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 lscon 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í commandevita 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_editque 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 bashmanual 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_aliaseslí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'

запретить

información relacionada