W bash zauważam, że jeśli polecenie korzystające z przekierowania nie powiedzie się, wszystkie programy, które działają wcześniej, nie zostaną uruchomione.
Na przykład ten program otwiera plik „a” i zapisuje 50 bajtów w pliku „a”. Jednak uruchomienie tego polecenia z przekierowaniem do pliku o niewystarczających uprawnieniach (~ root / log) nie powoduje zmiany rozmiaru pliku „a”.
$ ./write_file.py >> ~root/log
-bash: /var/root/log: Permission denied
cdal at Mac in ~/experimental/unix_write
$ ls -lt
total 16
-rw-rw-r-- 1 cdal staff 0 Apr 27 08:54 a <-- SHOULD BE 50 BYTES
Można by pomyśleć, że program uruchomi się, przechwyci dowolne dane wyjściowe (ale także zapisze do pliku „a”), a następnie nie zapisuje żadnych danych wyjściowych do ~ root / log. Zamiast tego program nigdy nie jest uruchamiany.
Dlaczego tak jest i w jaki sposób bash wybiera kolejność „kontroli”, które wykonuje przed uruchomieniem programu? Czy przeprowadzane są również inne kontrole?
ps Próbuję ustalić, czy program działający pod cronem faktycznie działał po przekierowaniu do pliku „odmowy uprawnień”.
write_file.py
program i wyślij jego wynik do ~root/log
bash:„ Przepraszam, ale nie możesz pisać do tego pliku! ”Powłoka robi dokładnie to, co powinna. Jeśli nie może zrobić tego, o co prosiłeś zrób to, natychmiast poinformuje cię, dlaczego jest problem, dając ci możliwość podjęcia decyzji, jak sobie z tym poradzić. Dla wszystkich opiekunów bash wie, bardzo złe rzeczy mogą się zdarzyć, jeśli uruchomisz to polecenie i nie będziesz mógł zapisać danych wyjściowych. Gdyby było wystarczająco ważne, abyś wyznaczył miejsce, aby go zapisać, byłoby źle, gdyby ASS | U | ME działało bez zapisywania standardowego wyjścia.
stdout
aby zrobić dokładnie to. Tak więc nie zobaczysz żadnych danych wyjściowych, nawet jeśli Twój program został uruchomiony.