Ich kann im Skript keinen Alias ​​verwenden, auch wenn ich ihn oben definiere!

Ich kann im Skript keinen Alias ​​verwenden, auch wenn ich ihn oben definiere!

Ich habe einen sehr seltsamen Fall ... Wenn ich ein Skript mit /bin/bash ausführe, kann es Aliase, die ich selbst innerhalb des Skripts festgelegt habe, nicht erkennen. Und das Seltsamste ist

$ 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

... wie oben gezeigt, wenn ich den Befehl "alias" im Skript ausführe, stellt sich heraus, dass bash übernommen hatirgendein Befehlin die Aliase, aber wenn ich dasirgendein Befehlselbst wird es trotzdem nicht erkannt!

Alles ist richtig, wenn ich den Befehl „sh“ verwende, um das Skript auszuführen. Ist es also ein Fehler von Bash? Oder übersehe ich etwas?

Jede Hilfe ist willkommen!

Antwort1

Einfach nichtverwendenAliase in Skripten. Es macht wenig Sinn, eine Funktion, die für die interaktive Verwendung in Skripten entwickelt wurde, zu verwenden. Verwenden Sie stattdessen Funktionen:

somecommand () {
    ls -alF
}

Funktionen sind viel flexibler als Aliase. Das Folgende würde die übliche Version lsmit einer Version überladen, die dies immer tut ls -F(Argumente werden übergeben $@, einschließlich aller von Ihnen verwendeten Flags), ziemlich genau so, wie es der Alias alias ls="ls -F"​​tun würde:

ls () {
    command ls -F "$@"
}

Das command„here“ verhindert, dass die Shell in eine Endlosrekursion geht, was sie sonst tun würde, da die Funktion auch aufgerufen wird ls.

Ein Alias ​​wäre niemals in der Lage, so etwas zu tun:

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
)

Dadurch wird die Funktion erstellt select_edit, die das Verzeichnis als Argument verwendet und den Benutzer auffordert, eine Datei in diesem Verzeichnis auszuwählen. Die ausgewählte Datei wird zur Bearbeitung in einem Editor geöffnet.

Das bashHandbuch enthält die Aussage

Für fast alle Zwecke werden Aliase durch Shell-Funktionen ersetzt.

Antwort2

Um interaktive Funktionen wie Alias ​​in einem Bash-Skript zu verwenden, müssen Sie es in einer interaktiven Bash-Shell ausführen. Ändern Sie dazu die erste Zeile so, dass sie ein enthält -i. Ihre neue Skriptdatei wird dann

#!/bin/bash -i
alias somecommand='ls -alF'
alias
somecommand 

Antwort3

Eine Art Duplikat voneine vorherige FrageDie Antworten dort sind jedoch ziemlich wortreich. Die kurze Antwort ist, dass Bash aus okkulten Gründen standardmäßig keine Aliase betrachtet, die in Skripten definiert sind. Sie müssen es explizit über eine shopt -s expand_aliasesZeile am Anfang des Skripts anweisen, dies zu tun. Tun Sie das, und dann findet Ihr Skriptirgendein Befehl.

Antwort4

Verwenden Sie shopt -sq expand_aliasesbeispielsweise diesen Code in UTF-8-Kodierung:

#!/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'

запретить

verwandte Informationen