W moim ~/.bashrc
pliku znajdują się dwie definicje:
commandA
, który jest aliasem na dłuższą ścieżkęcommandB
, który jest aliasem skryptu Bash
Chcę przetworzyć ten sam plik za pomocą tych dwóch poleceń, więc napisałem następujący skrypt Bash:
#!/bin/bash
for file in "$@"
do
commandA $file
commandB $file
done
Nawet po wylogowaniu się z sesji i ponownym zalogowaniu się, Bash monituje mnie o command not found
błędy dla obu poleceń podczas uruchamiania tego skryptu.
Co ja robię źle?
source ~/.bashrc
.Odpowiedzi:
Po pierwsze, jak powiedział ddeimeke, aliasy domyślnie nie są rozszerzane w nieinteraktywnych powłokach.
Po drugie,
.bashrc
nie jest odczytywany przez nieinteraktywne powłoki, chyba że ustawiszBASH_ENV
zmienną środowiskową.Ale co najważniejsze: nie rób tego! Proszę? Pewnego dnia przeniesiesz ten skrypt w miejsce, w którym nie zostaną ustawione niezbędne aliasy, i ponownie się zepsuje.
Zamiast tego ustaw i używaj zmiennych środowiskowych jako skrótów w skrypcie:
źródło
alias
przypadkach użycia. Npalias mv="mv -v --backup=numbered"
.$CMDA
/$CMDB
… Poza zmiennymi pisanymi dużymi literami dla samego basha w bashu i naprawdę działa, ten brak cytatów sprawia, że jestem naprawdę niespokojny… W każdym razie dzięki.gizmo
nie ma ścieżki lub istnieje polecenie o tej samej nazwie, ale o wyższym priorytecie. w przeciwnym razie możesz po prostu ustawićCMDA
zwykły na zwykłygizmo
.Jeśli zajrzysz na stronę bash, znajdziesz:
Więc umieść
w twoim skrypcie.
Po ustawieniu tego w skrypcie należy źródłowy plik aliasów.
źródło
shopt -s expand_aliases source ~/.bash_aliases
działa dla mnie idealnie. Często w .bashrc istnieje forma interaktywnego wykrywania powłoki:# If not running interactively, don't do anything [ -z "$PS1" ] && return
@Zaid, Może chcesz to sprawdzić w pliku, który pozyskałeś.shopt -s expand_aliases
nie trzeba iść przed definicją aliasu, ale przed użyciem aliasu. Dodawanie do @FrankSchubert: Interaktywne wykrywanie powłoki może być również wykonane przy użyciu$-
opcji, które zawierają opcje powłoki, szczególniei
jeśli powłoka jest interaktywna.~/.bash_aliases
może zależeć od innych rzeczy poprzednio załadowanego na interaktywnej powłoki ... Najbliższy rzeczą znalazłem zmienia swój hashbang do#!/bin/bash -li
Wciąż nie jest doskonały. Idealnie powinieneś używać funkcji, a nie aliasów.Aliasów nie można eksportować, więc nie są dostępne w skryptach powłoki, w których nie są zdefiniowane. Innymi słowy, jeśli je zdefiniujesz,
~/.bashrc
nie będą dostępneyour_script.sh
(chyba, że podasz~/.bashrc
w skrypcie, czego nie poleciłbym, ale istnieją sposoby, aby to zrobić poprawnie).Funkcje można jednak wyeksportować i byłyby dostępne dla skryptów powłoki uruchamianych ze środowiska, w którym są zdefiniowane. Można to zrobić umieszczając to w swoim bashrc:
Jak napisano w podręczniku Bash: „W prawie każdym celu funkcje powłoki są lepsze niż aliasy”.
źródło
alias commandA=...
gocommandA() { ... }
wtedyexport commandA
i otrzymasz identyczne zachowanie jak alias. Jest to prawie identyczna alternatywa dla aliasów, o ile wiem, która działa świetnie w skryptach bashalias b=bash
ułatwia wykonywanie czynności,b -c "echo test | grep test"
które byłyby trudne w funkcjach.b () { bash "$@"; }
następnieb -c "echo test | grep test"
To
i
jest dla interaktywnych i źródła twójbash
profil dla ciebie.źródło
Odkryłem, że czasami skrypt bash również nie rozpoznaje eksportu. Jednak zmieniając go na
pracuje dla mnie.
źródło