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 ls
mit 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 bash
Handbuch 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_aliases
Zeile am Anfang des Skripts anweisen, dies zu tun. Tun Sie das, und dann findet Ihr Skriptirgendein Befehl.
Antwort4
Verwenden Sie shopt -sq expand_aliases
beispielsweise 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'
запретить