Plik wykonywalny o nazwie „test” znajduje się w $ PATH, ale nie chce się uruchomić


13

Mam plik w $ HOME / bin (zanim zapytasz, tak, jest on na mojej ścieżce) o nazwie, testktórą potwierdziłem, można wykonać poprawnie, gdy uruchomię go z pełną ścieżką do pliku. Mam jednak naprawdę dziwny problem, gdy nie uruchamiam go w ten sposób. Gdy tylko uruchamiam testterminal, nic nie robi i natychmiast wraca. Wiem, że nie jest to problem ze znalezieniem pliku z kilku powodów:

  1. Brak komunikatu o błędzie. Zwykle, jeśli pliku nie można znaleźć lub nie można go wykonać, zostanie wydrukowany komunikat informujący o tym.

  2. Uruchomienie which testnadal zwraca prawidłową ścieżkę do pliku.

  3. Prawdopodobnie najdziwniejsze ze wszystkich - skrypt działa poprawnie po uruchomieniu strace. Próbowałem użyć, straceaby sprawdzić, czy mogę dowiedzieć się, co się dzieje, ale kiedy go uruchomiłem strace, zadziałało zgodnie z oczekiwaniami z 0 problemami.



Odpowiedzi:


45

testto niefortunna nazwa do użycia, jest to standardowe narzędzie do testów warunkowych . (W rzeczywistości jest to to samo polecenie co [w if [ ... ], wygląda po prostu na syntaktyczne, ale tak naprawdę jest zwykłym poleceniem.)

testjest również wbudowany np. w Bash, więc uruchamianie testnigdy nie szuka twojego pliku binarnego ze ścieżki.

bash$ help test | head
test: test [expr]
    Evaluate conditional expression.

    Exits with a status of 0 (true) or 1 (false) depending on
    the evaluation of EXPR.  Expressions may be unary or binary.  
    [...]

test bez argumentów zwraca tylko 1 (fałsz).

Uruchamianie strace testnie wymaga wbudowanej powłoki, ponieważ stracenie implementuje żadnych narzędzi. Po prostu wykorzystuje to, co znajduje w twoim PATH. Zauważ, że prawdopodobnie masz standard testw /bin/testlub /usr/bin/test, więc jeśli to będzie pierwszy w PATH, straceuruchom go.

Na moim whichBashie jest także zewnętrzne polecenie, więc nie ma też pojęcia o wbudowanych. Z drugiej strony, komenda jest wbudowany do powłoki i pokaże, że .typetype testtest is a shell builtin

Zobacz także: Dlaczego nie użyć „które”? Czego więc użyć?


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.