Bash: Co robi „> |”?

148

Właśnie widziałem to spisane;

$ some-command >| /tmp/output.txt

Rury pionowe są używane w standardowych przekierowaniach „przesyłanie” danych wyjściowych z jednego polecenia do drugiego, czy >|w rzeczywistości jest całkowicie bezużyteczne, ponieważ byłoby takie samo jak >w tym scenariuszu?

jwbensley
źródło

Odpowiedzi:

220

To nie jest bezużyteczne - to wyspecjalizowana forma zwykłego >operatora przekierowania (i być może mylące, nie ma nic wspólnego z rurami). basha większość innych współczesnych powłok ma opcję noclobber, która zapobiega nadpisywaniu lub niszczeniu pliku, który już istnieje. Na przykład, jeśli noclobberjest to prawda, a plik /tmp/output.txtjuż istnieje, to powinno się nie powieść:

$ some-command > /tmp/output.txt

Można jednak jawnie zastąpić ustawienie za noclobberpomocą >|operatora przekierowania - przekierowanie będzie działać, nawet jeśli noclobberjest ustawione.

Możesz dowiedzieć się, czy noclobberjest ustawiony w bieżącym środowisku za pomocą set -o.

Dla nuty historycznej zarówno opcja „noclobber”, jak i jej funkcje obejścia pochodzą z csh(późnych lat 70.). kshskopiowałem go (wczesne lata 80.), ale użyłem >|zamiast >!. POSIX określił kshskładnię (więc wszystkie powłoki POSIX, w tym bash, nowsze pochodne popiołu używane jako sh w niektórych systemach obsługują tę funkcję). Zsh obsługuje obie składnie. Nie sądzę, aby został dodany do jakiegokolwiek wariantu powłoki Bourne'a, ale mogę się mylić.

D_Bye
źródło
3
@sch - re twoja historyczna notatka (dzięki za dodatkowe informacje, btw) - FreeBSD shma noclobber, od około maja 2002 r.
D_Bye 24.12