Aby odczytać plik tekstowy dosłownie, nie używaj zwykłego read, który przetwarza dane wyjściowe na dwa sposoby:
readinterpretuje \jako znak ucieczki; użyj, read -raby to wyłączyć.
readdzieli się na słowa na znaki w $IFS; ustaw IFSna pusty ciąg, aby to wyłączyć.
Zwykle idiomem przetwarzającym plik tekstowy wiersz po wierszu jest
while IFS= read -r line; do …
Aby uzyskać wyjaśnienie tego idiomu, zobacz Dlaczego jest while IFS= readużywany tak często zamiast IFS=; while read..? .
Aby napisać ciąg dosłownie, nie używaj zwykłego echo, który przetwarza ciąg na dwa sposoby:
- W niektórych powłokach
echoprzetwarza odwrotne ukośniki. (W przypadku bash zależy to od ustawienia xpg_echoopcji).
- Kilka ciągów traktowanych jest jako opcje, np.
-nLub -e(dokładny zestaw zależy od powłoki).
Przenośnym sposobem drukowania łańcucha jest dosłownie printf. (Nie ma lepszego sposobu na bash, chyba że wiesz, że twoje wejście nie wygląda jak opcja echo.) Użyj pierwszego formularza, aby wydrukować dokładny ciąg, a drugiego formularza, jeśli chcesz dodać nowy wiersz.
printf %s "$line"
printf '%s\n' "$line"
Jest to odpowiednie tylko do przetwarzania tekstu , ponieważ:
- Większość pocisków będzie się dusić na znakach zerowych na wejściu.
- Kiedy czytasz ostatni wiersz, nie możesz wiedzieć, czy na końcu był nowy wiersz, czy nie. (Niektóre starsze powłoki mogą mieć większe problemy, jeśli dane wejściowe nie kończą się nową linią).
Nie można przetwarzać danych binarnych w powłoce, ale współczesne wersje narzędzi na większości unikatów radzą sobie z dowolnymi danymi. Aby przekazać wszystkie dane wejściowe do wyniku, użyj cat. Posiadanie stycznej echo -n ''jest skomplikowanym i nieprzenośnym sposobem na nic nie robienie; echo -nbyłby równie dobry (lub nie w zależności od powłoki) i :jest prostszy i w pełni przenośny.
: >| "$file"
cat >>"$file"
lub prościej
cat >|"$file"
W skrypcie zwykle nie trzeba go używać, >|ponieważ noclobberdomyślnie jest wyłączony.