Mam plik wykonywalny mpiexec
, którego pełna ścieżka to ~/petsc-3.2-p6/petsc-arch/bin/mpiexec
. Ponieważ chcę wykonać to polecenie w różnych katalogach (bez konieczności ponownego wpisywania całej ścieżki), ustawiam alias w moim .bashrc
pliku domowym :
alias petsc="~/petsc-3.2-p6/petsc-arch/bin/mpiexec"
co pozwala mi mpiexec
łatwo wykonać ten plik w wierszu polecenia, wpisując:
petsc myexecutable
Próbowałem napisać plik skryptu powłoki o nazwie script
, używając mojego nowego aliasu petsc
jako polecenia. Po udzieleniu skryptowi powłoki odpowiednich uprawnień (za pomocą chmod
) próbowałem uruchomić skrypt. Dał mi jednak następujący błąd:
./script: line 1: petsc: command not found
Wiem, że mogłem napisać pełną ścieżkę do mpiexec
pliku, ale kłopotliwe jest zapisywanie pełnej ścieżki za każdym razem, gdy chcę napisać nowy skrypt. Czy istnieje sposób na użycie mojego aliasu petsc
w pliku skryptu? Czy istnieje sposób, w jaki mogę edytować moją wersję .bashrc
lub .bash_profile
sprawić, aby tak się stało?
.bash_aliases
? A może aliasing ścieżki bezwzględnej zamiast ścieżki względnejalias petsc='/home/user/petsc-3.2-p6/petsc-arch/bin/mpiexec'
Odpowiedzi:
W skrypcie powłoki użyj pełnej ścieżki zamiast aliasu.
W skrypcie powłoki ustaw zmienną, inną składnię
Użyj funkcji w skrypcie. Prawdopodobnie lepiej, jeśli
petsc
jest złożonyŹródło aliasów
Prawdopodobnie nie chcesz źródła
.bashrc
, więc, IMO, jedna z pierwszych 3 byłaby lepsza.źródło
shopt -s expand_aliases
tego samego skryptu.|
. Tutaj użyjshopt -s expand_aliases
& lokalnego aliasu, np.alias myalias='echo abc|rev'
- wymaga podziału linii przed użyciem (patrz ALIASY wman bash
). Punkt 4: Plik źródłowy może uniemożliwić nieinteraktywne wykonanie, tj. W skrypcie. Spójrz na początkuexit
lubreturn
na przykład[ -z "$PS1" ] && return
(sprawdza, czy podstawowym szybka nie jest ustawiony wskazując nieinteraktywną shell) lub może być czek nai
w$-
($-
zawiera opcje powłoki,i
oznacza interaktywny). Zobaczman bash
te zmienne.Aliasy są przestarzałe na rzecz funkcji powłoki. Ze strony
bash
podręcznika:Aby utworzyć funkcję i wyeksportować ją do podpowłoki, umieść w swoim
~/.bashrc
:Następnie możesz swobodnie wywoływać polecenia ze skryptów.
źródło
"$@"
tylko do obsługi argumentów.Funkcje i aliasy powłoki są ograniczone do powłoki i nie działają w wykonywanych skryptach powłoki. Alternatywy dla twojego przypadku:
(jeśli nie masz zamiaru używać
mpiexec
zamiastpetsc
) Dodaj$HOME/petsc-3.2-p6/petsc-arch/bin
do swojejPATH
zmiennej. Można to zrobić, edytując~/.profile
i dołączając:Zaloguj się ponownie, aby zastosować te zmiany
Utwórz katalog
~/bin
istwórz skrypt otoki
petsc
zawierający:jeśli program na to pozwala, możesz pominąć skrypt powłoki i utworzyć dowiązanie symboliczne za pomocą polecenia:
źródło
W bash 4 można użyć zmiennej specjalnej:
$BASH_ALIASES
.Na przykład:
Alternatywnie zdefiniuj jako zmienną, a następnie użyj podstawienia polecenia lub
eval
.Na przykład zamiast definiować alias, taki jak:
zdefiniuj to jako:
zamiast. Następnie wykonaj to przez:
lub:
źródło
${BASH_ALIASES[alias]}
jest to fajna opcja. W przeciwnym razie musiałem edytować wiele linii moich .bash_aliases, aby zastosować inne rzeczy. Dziękuję Ci.Możesz zmusić bash do wykonania skryptu jako interaktywnej powłoki z flagą -i. Dzięki temu plik .bashrc zdefiniuje aliasy i inne funkcje.
Przykład:
Więcej informacji:
źródło
.bashrc
jest również odczytywany podczas wykonywania nieinteraktywnego polecenia SSH (dlatego na górze ma sprawdzanie interaktywności)Tak więc prawdziwa odpowiedź na to pytanie, dla tych, którzy chcą używać rzeczywistych aliasów w skryptach powłoki zamiast alternatyw dla nich, to:
Co do tego , dlaczego chciałbym to zrobić: Z powodu niezwykłych okoliczności muszę oszukać plik Docker, aby pomyślał, że jest to skrypt powłoki.
źródło
W
.bash_aliases
:Lub włóż funkcję
.bashrc
. Zwykle są przechowywane.bashrc
tylko ustawienia konfiguracjibash
.W terminalu:
source .bash_aliases
petsc arg(s)
Zaleta: nie trzeba
export -f petsc
się.bash_aliases
. Aliasy są przestarzałe, ale używanie.bash_aliases
funkcji jest w porządku.źródło
Więc jeśli masz plik wywoływany za
script.sh
pomocą poleceń, które obejmują użycie aliasów, po prostu wpisz:źródło
.
lubsource
buiiltin powoduje, że bieżąca powłoka wykonuje wszystkie zawarte w nim polecenia. Jeśli rozwinięcie aliasu wystąpi w powłoce, w której uruchomiono.
lubsource
, nastąpi ono. Jednak ważne jest, aby zdawać sobie sprawę, że ta metoda jest tylko czasami przydatna, ponieważ często trzeba lub chce wykonać skrypt we własnej powłoce, z własnym środowiskiem. Skrypty powłoki napisane z zamiarem wykonania w zwykły sposób zwykle nie powinny być pozyskiwane zamiast tego - często nie działają poprawnie.(EDYCJA: usunięto funkcje, ponieważ źle odczytałem wywołanie mpiexec.)
Jeśli jedyne czego potrzebujesz to mniej pisania, dlaczego nie umieścisz folderu w $ PATH? Lub utworzyć dowiązanie symboliczne do mpiexec z jakiegoś folderu w $ PATH? Czy (mój ulubiony) umieść alias w skrypcie, który pozyskujesz w skrypcie wywołującym?
źródło
"$@"
.