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.
$(…)
- patrz to , to i to .
which kill
w backticks (nie można ich umieścić w komentarzach) jest nieco krótsze.