Snažil jsem se rychle upravit .hgignore
soubor z Cygwin bash shellu dnes a přidal jsem řádek, který byl chybou. Nejsem si jistý, jestli to byl nejlepší způsob, jak to udělat, ale rychle mě napadlo použít head -1 .hgignore
odstranit problematický řádek (dříve jsem měl v souboru pouze jeden řádek). Jistě, když je spuštěn, dává první řádek jako jediný výstup.
Ale když jsem se pokusil přesměrovat výstup a přepsat soubor pomocí head -1 .hgignore > .hgignore
, soubor byl prázdný. proč se to děje? Pokud se místo toho pokusím přidat, head -1 .hgignore >> .hgignore
, připojí se správně, ale to zjevně není požadovaný výsledek. Proč v tomto případě nefunguje zkrácené přesměrování?
Přijatá odpověď:
Když shell dostane příkazový řádek jako:command > file.out
samotný shell otevře (a možná vytvoří) soubor s názvem file.out
. Shell nastaví deskriptor souboru 0 na deskriptor souboru souboru, který získal z otevřeného prostředí. Takto funguje přesměrování I/O:každý proces zná deskriptory souborů 0, 1 a 2.
Nejtěžší na tom je, jak otevřete file.out
. Většinou chcete file.out
otevřeno pro zápis s offsetem 0 (tj. zkráceno) a to je to, co shell udělal za vás. Zkrátil .hgignore, otevřel jej pro zápis, zkopíroval deskriptor souboru na 0 a poté spustil head
. Okamžité clobování souborů.
V bash shellu provedete set noclobber
změnit toto chování.