Fura I/O redirect jelenség

Fórumok

Debian squeeze alatt, demóztam zfs-t egy régi kollégámnak, és az alábbi meglepetéssel találkoztam:

fs# zfs send mypool/home@20130301 > x1
fs# zfs send mypool/home@20130301 |cat >x2
fs# ls -l x*
-rw-r--r-- 1 root root 131072 Mar 1 10:27 x1
-rw-r--r-- 1 root root 1106112 Mar 1 10:27 x2

Az x2 fájl rendben van, abból meg is a visszaállítás, de mi van az x1-el???
Még csak nem is arról van szó, hogy valami lemaradt a végéről:

fs# dd if=x1 bs=10240 count=1 of=y1; dd if=x2 bs=10240 count=1 of=y2;
fs# diff y1 y2
Binary files y1 and y2 differ

Hogyan lehetséges ez?
20 év Unix/Linux alatt egyszer sem láttam, hogy a valami > file és a valami | cat > file különböző eredményt adott volna...

Először shell hibára gyanakodtam, de bash, ksh, tcsh és zsh alatt is pontosan ugyanez a jelenség.
Visznot, úgy gondolom, ha a program az stdout-ra dologzik, akkor nem is tudja megkülönböztetni, hogy az stdout hova van irányítva, ezért úgy gondolom, a zfs send sem lehet a hibás.

De akkor meg mi van?

Hozzászólások

Nem lehet hogy a zfs send csinál valamit másképp? Persze nem tudom épeszű okát elképzelni, de ki tudja. Van valami mód arra, hogy a zfs snapshot épségét ellenőrizze az ember? Mármint azon túl, hogy felcsapja valahová és ott ellenőrzi a kapott adatot.

esetleg a cat sortöréseket konvertál? Nem kéne neki :)

úgy gondolom, ha a program az stdout-ra dologzik, akkor nem is tudja megkülönböztetni, hogy az stdout hova van irányítva

De igen, az isatty fuggveny megmondja. Peldaul a gzip hasznalja is:

[muszi@muszi ~]$ echo | gzip
gzip: compressed data not written to a terminal. Use -f to force compression.

Még az első nap első 2 órájában tanított ls is megcsinálja ugyanezt. Megvalósítástól függő ugyan, de van ahol az ls az "ls -1" és van ahol az ls az "ls -C" módon fut akkor, ha az stdout képernyőt jelent. (Direkt írtam ezt és nem az átiránzítás hiányát, ugyanis lehet pl. az ls-t átirányítaani, de szintén terminálra. Szóval simán lehet *legalább* ennyit észlelni (és szükség esetén ennél jóval többet is).

Amúgy a shell-be beépített test parancsnak is van rá eszköze, [ -t filedescriptor ] formában.