Используйте команды с круглыми скобками, например, diff в сценарии оболочки - PullRequest
0 голосов
/ 11 июля 2019

Я хочу, чтобы вывод двух команд

diff вывод из cat file1 и cat file2

И я обнаружил, что решение

diff <(cat file1) <(cat file2)

1012 * Тем не менее *

Если я вставлю это в скрипт оболочки Скобки не могут быть распознаны, поскольку это означает вызов sub-shell в сценарии оболочки .. (Интересно, верно ли то, что я знаю)

#!bin/bash
diff <(cat $1) <(cat $2)

Синтаксическая ошибка рядом с неожиданным токеном `('

Есть ли решение использовать команды, требующие скобок в сценарии оболочки?

Я пробовал

 diff `<(cat $1) <(cat $2)`
 diff `<(cat $1)` `<(cat $2)`
 diff "<(cat $1) <(cat $2)"
 diff <`(`cat $1`)` <`(`cat $2`)`

но ничего из вышеперечисленного не работает

Я использовал для вывода вывода в другие файлы и сравнения этих файлов

cat $1 > out1.txt
cat $2 > out2.txt
diff -b out1.txt out2.txt

Я знаю, что это может сработать, но я просто хочу знать, есть ли какой-нибудь способ без предварительного вывода выходных данных в файлы

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Если вы пишете скрипт, содержащий bash команды, вам нужно запустить его с bash, а не sh.(Учтите: вы ожидаете, что rm scriptfile выполнит команды bash, содержащиеся в файле?)

Если вы хотите что-то более переносимое, вы можете явно использовать FIFO (в частности, команду mkfifo):

#!/bin/sh

mkfifo fifo1 fifo2
cat "$1" >>fifo1 &
cat "$2" >>fifo2 &
diff -b fifo1 fifo2
rm fifo1 fifo2
0 голосов
/ 11 июля 2019

Я попробовал этот test.sh и получил правильный вывод.

#! /bin/bash
diff <(cat $1) <(cat $2)
...