Як відрізнити файл і вихід з команди?


32

Зазвичай ви пишете:

diff file1 file2

Але я хотів би відрізняти файл і вихід від команди (тут я роблю команду тривіальною):

diff file1 <(cat file2 | sort)

Гаразд, ця робота, коли я ввожу це вручну під час підказки оболонки, але коли я ставлю точно такий же рядок у скрипті оболонки, а потім запускаю сценарій, я отримую помилку.

Отже, питання - як це зробити правильно?

Звичайно, я хотів би уникати запису результатів у тимчасовий файл.

Відповіді:


39

Я підозрюю, що ваш сценарій і ваша оболонка різні. Можливо, у вас є #!/bin/shвершина сценарію як перекладач, але ви використовуєте bashяк свою особисту оболонку. Ви можете дізнатися, яку оболонку запускаєте в терміналі, запустивши echo $SHELL.

Найпростіший спосіб зробити це, який повинен працювати в більшості оболонок, - це використовувати перенаправлення труби замість оператора зчитування файлів, який ви надаєте. Символ "-" є стандартною номенклатурою для читання STDIN і часто може використовуватися як заміна імені файлу в списку аргументів:

cat file2 | sort | diff file1 -

Або уникати марного використання кота :

sort < file2 | diff file1 -

Ах, ти хороший, справді, я не перевіряв, ш ш баш чи ні. Дуже дякую за рішення.
greenoldman

Це файл, що відрізняється від stdout. Тепер, як відрізняти stdout з файлом? Я маю на увазі протилежний напрямок. це -Rу випадку використанняgit diff --no-index
Nakilon

@Nakilon Ви б просто змінити порядок аргументів: diff - file1.
Калеб

Класно. Це не спрацювало git diff.
Накілон

@Nakilon Звичайно, ні, чому б це зробити? git diffє зовсім іншим звіром і працює над посиланнями на глобальні об'єкти у своєму внутрішньому індексі, а не на файли; diffпрацює у файловій системі. -Синтаксис просто оболонки синтаксичного цукру для /dev/stdin, файлу , що представляє потік STDIN. Отже, чому diffможна використовувати його як заміну імені файлу. Тим часом git diffне шукає файлів, він шукає об’єкти, тож вам доведеться передати їм те, що він розпізнає. Не використовуйте його для порівняння файлів між собою, використовуйте diffдля цього.
Калеб

-4

Обсяг стандартного введення - це сам сценарій, тому просто покладіть свій код всередину блоку, як це:

{
  diff file1 <(sort file2)
}

Таким чином, сфера дії STDIN знаходиться всередині блоку.

Я спробував, і це працює.


Це не функція, це блок, і це не має ніякого значення.
Жил "ТАК - перестань бути злим"

@gilles Thx для виправлення. До речі, я спробував себе, і це працює. Ти що?
tmow

3
Блок не впливає на дійсність <(…)конструкції. Ваш сценарій буде працювати чи не працювати залежно від того, запускаєте його у оболонці, яка підтримує <(…)чи ні (ksh93 / bash / zsh vs Bourne / ash / kshk88). Відповідь Калеба це все зводить.
Жил "ТАК - перестань бути злим"

1
@ gilles добре, THX для пояснення.
tmow
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.