2015-05-10 21 views
6

Używam perla wiersza polecenia do wykonania podstawiania w miejscu w pliku. Jest to kod: (uwaga na trwałą korzeniowy z sudo)

sudo perl -i -pe "s/foo/bar/" config.txt 

Jeśli to się powiedzie, "echo $? powrót 0. Teraz robię plik un zapisu nawet do korzenia przy użyciu chattr tak:

sudo chattr +i config.txt 

uruchomić tego samego polecenia Perl i nie jest on z tego błędu:

Can't remove config.txt: Operation not permitted, skipping file.

Który jest w porządku. Jednak "echo $?" nadal zwraca 0 w tym przypadku. Dlaczego tak jest? Czy nie powinien zwracać niezerowej wartości wskazującej na błąd?

Odpowiedz

2

Problem polega na tym, że Perl nie wraca z niezerowym stanem wyjścia dla tego warunku (sudo przekazuje na wyjściu status polecenia, które mu podano), co jest nieco irytujące. Można obejść ten problem poprzez uznanie, że pętla linii czytanie nigdy nie zostanie wprowadzony, jeśli plik nie zostać zmieniona i obsługiwać go z flagą:

sudo perl -i -ne 's/foo/bar/; print; $wrk = 1; }{ $wrk or exit 1' config.txt 

Eskimos z życzeniami (lub motyla) „operator” }{ wprowadza blok, w pewnym sensie; co przychodzi po tym, jak zostanie wykonane, gdy pętla odczytująca linie z pliku zakończyła się. Sposób działania jest opisany here.

Ograniczeniem jest to, że spowoduje to również zgłoszenie błędu, jeśli config.txt jest puste. Im krótszy, jeśli nieco trudniejszy sposób, jest użycie specjalnej zmiennej licznika linii $. w tym samym celu:

sudo perl -i -ne 's/foo/bar/; print; }{ $. or exit 1' config.txt 
+0

Dziękuję. działa świetnie. –

Powiązane problemy