Używam Bash jako interaktywnej powłoki i zastanawiałem się, czy istnieje prosty sposób, aby Bash uruchomił polecenie systemowe zamiast wbudowanego polecenia powłoki w przypadku, gdy oba mają tę samą nazwę.
Na przykład użyj system kill
(od util-linux
), aby wydrukować identyfikator procesu (pid) nazwanego procesu (procesów) zamiast wysyłać sygnał:
$ /bin/kill -p httpd
2617
...
Bez określenia pełnej ścieżki polecenia systemowego zamiast polecenia systemowego jest używane wbudowane Bash. kill
Wbudowane nie ma -p
opcji więc polecenie kończy się niepowodzeniem:
$ kill -p httpd
bash: kill: p: invalid signal specification
Próbowałem odpowiedzi wymienionych w Make bash, używając zewnętrznego polecenia `time` zamiast wbudowanej powłoki, ale większość z nich działa tylko dlatego, że w time
rzeczywistości jest słowem kluczowym powłoki, a nie wbudowaną powłoką .
Poza tymczasowym wyłączeniem wbudowanego Bash enable -n kill
, najlepszym rozwiązaniem, jakie do tej pory widziałem, jest użycie:
$(which kill) -p httpd
Czy istnieją inne łatwiejsze (wymagające mniej pisania) sposoby wykonywania poleceń zewnętrznych zamiast wbudowanej powłoki?
Zauważ, że kill
to tylko przykład i chciałbym uogólnionego rozwiązania podobnego do sposobu, w jaki prefiks command
wbudowanego zapobiega uruchamianiu funkcji o takiej samej nazwie jak polecenie zewnętrzne. W większości przypadków zazwyczaj wolę używać wbudowanej wersji, ponieważ oszczędza to rozwidlania nowego procesu, a czasami wbudowane funkcje nie są dostępne w poleceniu zewnętrznym.
źródło
which kill
w backticks (nie można ich umieścić w komentarzach) jest nieco krótsze.$(…)
- patrz to , to i to .Odpowiedzi:
Zakładając, że
env
masz na swojej drodze:env
uruchamia plik wykonywalny nazwany pierwszym argumentem w (ewentualnie) zmodyfikowanym środowisku; jako taki nie wie o wbudowanych poleceniach powłoki ani nie działa z nimi.Powoduje to pewne cruft kontroli zadań powłoki, ale nie opiera się na zewnętrznej komendzie:
exec
wymaga pliku wykonywalnego do zastąpienia bieżącej powłoki, więc nie używa żadnych wbudowanych funkcji. Zadanie jest uruchamiane w tle, aby zastąpić rozwidloną powłokę tła, a nie bieżącą powłokę.źródło
env
jest wyraźnie właściwą odpowiedzią IMHO.command -p cmd
wywoływanie zewnętrznego poleceniazsh
, a niebash
.(exec kill -p http)
powoduje, że zadanie zastępuje podpowłokę zamiast bieżącej powłoki i nie musisz radzić sobie z cruft kontroli zadań.env
także nie wie o wbudowanych powłokach, ponieważ nie jest to powłoka. Można by uzyskać ten sam efekt znice
lubxargs
dowolny inny program takiego.Najprostszym sposobem na zrobienie tego, co chcesz, jest umieszczenie linii
do twojego
~/.bashrc
pliku. Następnie każde nowe logowanie / wywołanie bash zinterpretuje „zabij” jako/bin/kill
.źródło
command
rozwiązania), zamiast tworzyć osobny alias dla każdego polecenia „zacieniowanego”. Zredagowałem teraz moje pytanie, aby było jaśniejsze i bardziej jednoznaczne. W większości przypadków zwykle wolę używać wbudowanej wersji, ponieważ procesy mogą być określone za pomocą identyfikatorów zadań. W każdym razie dzięki.Jeśli znasz rozwiązanie, które wymaga trochę pisania i potrzebujesz rozwiązania, które wymaga mniej pisania, skompiluj je:
Skrót rzeczy, które zwykle wymagają pewnego wysiłku, jest tym, co wyróżniają komputery.
źródło
W tym bardzo szczególnym przypadku polecenie
pgrep
dokładnie odpowiada potrzebom.W ogólnym sensie funkcja działa. Z „polecenia pliku”:
zadzwoń jako
Ale jeśli potrzebujesz mniej pisania, nie ma krótszej drogi niż dobry alias.
Z pojęcia „list pid” (lp):
następnie wpisz:
źródło
(W zsh) Możesz poprzedzić dowolną nazwę polecenia znakiem =, aby uzyskać wersję systemową zamiast wbudowanej. Jest to również przydatny sposób na uniknięcie aliasów, które psują określony scenariusz.
źródło
zsh
jedyna rzecz. Używam go regularnie, ale sprawdzębash
jutro z komputera.zsh
. Chociaż otagowałem to pytaniebash
i użyłem go w tytule, powinieneś zachować tę odpowiedź, ponieważ użytkownik zsh nadal uznałby ją za przydatną.Możesz wysłać raport o błędzie na stronie
kill
podręcznika i zapytać, dlaczego obejmuje to niestandardowe opcje, które są pobieranepkill
i używane,pkill
gdy chcesz uzyskać dostęp do funkcjipkill.
Jeśli zadzwonisz:
pkill httpd
unikasz opisywanych problemów.
źródło