Próbuję napisać wszystkie moje sh
skrypty startowe / env do pracy z tak dużą ilością OSUSZANIA i jak najwięcej: „działa na każdym * nix, w którym go klonuję”, jak to możliwe. Oznacza to upewnienie się, że jeśli spróbuję uruchomić kod, którego tam nie ma, kod nie działa płynnie. W tym celu muszę móc sprawdzić, czy istnieją programy. Wiem, jak sprawdzić, czy plik istnieje, ale nie jestem pewien, jak sprawdzić, czy aplikacja jest wykonywalna na ścieżce. Wolę używać $ PATH, ponieważ niektóre z nich muszą pracować na arch, ubuntu i centos. Niektóre mogą być zainstalowane w moim katalogu głównym, na systemach, na których nie mam roota, inne mogą nie zostać zainstalowane, a jeszcze inne mogą być zainstalowane na ścieżkach systemowych.
shell
shell-script
posix
ksenoterracid
źródło
źródło
Odpowiedzi:
Zastosowanie
type commandname
. Zwraca true, jeślicommandname
jest cokolwiek wykonywalnego: alias, funkcja, wbudowane lub zewnętrzne polecenie (sprawdzone w$PATH
). Alternatywnie, użyjcommand commandname
zwracanej wartości true, jeślicommandname
jest to polecenie wbudowane lub zewnętrzne (wyszukiwane w$PATH
).Istnieje kilka wariantów sh (zdecydowanie wcześniejszych niż POSIX; wiem o
/bin/sh
OSF1 ≤3.x i niektórych wersjach powłoki Almquist we wczesnych wersjach NetBSD i kilku dystrybucjach Linuksa z XX wieku), w którychtype
zawsze zwraca 0 lub nie istnieć. Nie sądzę, aby jakikolwiek system był dostarczany z tym tysiącleciem. Jeśli kiedykolwiek je spotkasz, możesz skorzystać z funkcji$PATH
ręcznego wyszukiwania :Ta funkcja jest ogólnie przydatna, jeśli chcesz wykluczyć wbudowane funkcje i funkcje i wyszukać nazwę w
$PATH
. Większość powłok ma do tego wbudowanecommand -v
, choć jest to stosunkowo nowy dodatek do POSIX (wciąż opcjonalny od POSIX: 2004). Jest to w zasadzie wersja przyjazna dla programistówtype
: drukuje pełną ścieżkę do pliku wykonywalnego$PATH
, samą nazwę dla funkcji wbudowanej lub funkcji oraz definicję aliasu dla aliasu.Ksh, bash i zsh również muszą
type -p
wyszukiwać tylko pliki wykonywalne$PATH
. Zauważ, że w bash, zwracanym statusemtype -p foo
jest 0, jeślifoo
jest wbudowaną funkcją lub; jeśli chcesz przetestować plik wykonywalny w$PATH
, musisz sprawdzić, czy dane wyjściowe nie są puste.type -p
nie ma w POSIX; na przykład jesion Debiana (który jest/bin/sh
na Ubuntu) go nie ma.źródło
if [ type keychain ]; then
nie zadziała? Mam błąd./home/xenoterracide/.zshrc:84: parse error: condition expected: type
Przypuszczam, że mógłbym napisać, że funkcja istnieje ... Po prostu pomyślałem, że może to być prostsze w pewnym sensie ...if type $APP >/dev/null 2>/dev/null; then ...
Nie chcesz[]
.type -p
jeśli konkretnie szukasz polecenia w$PATH
(nie aliasy, funkcje lub wbudowane).Jeśli szukasz tylko programów zewnętrznych, możesz także ich użyć. Nie wiem jednak, jak to jest przenośne.
źródło
type
lubcommand
;which
na przykład nie ma go w POSIX. W praktycewhich
istnieje prawie wszędzie, ale w niektórych miejscach (gdzie jest zaimplementowany jako skrypt csh) używa innej ścieżki (z powodu a.cshrc
), co nie pozwala na osiągnięcie celu.