губка з moreutils - в чому різниця перенаправлення оболонки? корисні приклади?


16
> brew install moreutils                                                          
==> Downloading https://homebrew.bintray.com/bottles/moreutils-0.55.yosemite.bottle.tar.gz    
######################################################################## 100.0%               
==> Pouring moreutils0.55.yosemite.bottle.tar.gz       
🍺  /usr/local/Cellar/moreutils/0.55: 67 files, 740K   

губка зчитує стандартне введення та записує його у вказаний файл. На відміну від перенаправлення оболонки, губка вбирає весь її вхід до написання вихідного файлу. Це дозволяє побудувати трубопроводи, які читаються з та записуються в один і той же файл.

Я не розумію. Наведіть, будь ласка, кілька корисних прикладів.

Що означає всмоктування ?



Інший приклад - expand foo.txt | sponge foo.txt. Дивіться також: stackoverflow.com/a/33639324/1959808
Іоанніс Filippidis

tl; dr sponge"вбирає" свій вхід до обрізання вихідного файлу
BallpointBen

Відповіді:


33

Припустимо , що у вас є файл з ім'ям input, ви хочете , щоб видалити всі початок рядка з #в input. Ви можете отримати всі рядки, які не починаються з #використання:

grep -v '^#' input

Але як зробити зміни input? За допомогою стандартного інструментального інструменту POSIX вам потрібно використовувати тимчасовий файл, наприклад:

grep -v '^#' input >/tmp/input.tmp
mv /tmp/input.tmp ./input

З перенаправленням оболонки:

grep -v '^#' input >input

врізається, inputперш ніж читати з нього.

З sponge, ви можете:

grep -v '^#' input | sponge input

4
Ви насправді можете безпечно читати та записувати файл одночасно, доки байти трансформуються лише за допомогою <>оператора.
Кріс Даун

@ChrisDown: Так, я маю на увазі, не роблячи це корупція
cuonglm

Я не впевнений, що ви маєте на увазі про "корупцію". На відміну від >і <, <>не пошкоджує файл, якщо щось пішло не так. Ви можете досить легко писати байт за байтом, використовуючи його. Наприклад, спробуйте використовувати його tr.
Кріс Даун

@ChrisDown: Дозвольте видалити це речення, щоб уникнути плутанини. Я фактично маю на увазі під час використання <>fileви відкриваєте файл для читання та запису, але насправді нічого не пишете у файл.
cuonglm

1
Думаю, що @ChrisDown намагається зробити це в тому, що <>не врізає файл, а просто замінює існуючі байти на новий вихід. Якщо новий вихід занадто короткий, у вас залишиться сміття в кінці файлу. Але якщо новий вихід досить довгий, ризику немає.
BallpointBen

8

Сама домашня сторінка moreutils документує типовий випадок використання:

sed "s/root/toor/" /etc/passwd | grep -v joey | sponge /etc/passwd

Тут / etc / passwd і записується, і читається, і змінюється. Без розгинання stdin перед записом, / etc / passwd може бути пошкоджений (оскільки файл змінювався під час читання).


І це буде гарним прикладом на сторінці moreutils, якби це пояснило так, як ви це зробили :-)
Br.Bill
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.