вывод командной строки в команду на следующей строке - PullRequest
0 голосов
/ 19 января 2019

Я довольно новичок в Unix, и мне трудно понять, как разбить длинную однострочную команду на несколько строк, передавая результаты от одной к другой.

Я понял, что вывод идет на стандартный вывод, но не знаю, есть ли способ ссылаться на него из другой строки.

Например: следующий скрипт объединяет все файлы scss в каталоге и помещает два возврата между ними, но вместо использования | и просто делая скрипт длиннее, я бы хотел использовать его в следующей строке. Есть ли способ сделать это?

> for f in dev/scss/*.scss; do cat $f; echo; echo; done
> <use output from above here>

Спасибо за любую помощь

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Вы можете использовать обратную косую черту, чтобы разбить команды на несколько строк.

for f in dev/scss/*.scss; do cat "$f"; echo; echo; done \
    | additional-processing

После определенных операторов, таких как &&, || и |, обратная косая черта не требуется.Баш знает, что команда не закончена.Если вы поместите | в предыдущую строку, вам не понадобится обратная косая черта.

for f in dev/scss/*.scss; do cat "$f"; echo; echo; done |
    additional-processing

Таким образом, вы можете объединить большое количество команд.

for f in dev/scss/*.scss; do cat "$f"; echo; echo; done |
    foo |
    bar |
    baz

Еслицикл становится громоздким, вы должны также рассмотреть возможность его оборачивания в вызове функции.Мне нравится такой подход, потому что это означает, что вам не нужно втискивать все в небольшое количество строк.Вы можете дать петле больше передышки с каждой командой на отдельной строке.

loop() {
    for f in dev/scss/*.scss; do
        cat "$f"
        echo
        echo
    done
}

Это позволяет сократить ваш конвейер до чего-то более читабельного типа:

loop | foo | bar | baz

PS Всегда заключайте в кавычки расширения переменных.Введите cat "$f", чтобы имена файлов с пробелами и другими специальными символами обрабатывались правильно.

0 голосов
/ 19 января 2019

Самый прямой ответ таков:

IFS='\0'
result=`for f in dev/scss/*.scss; do cat $f; done`
echo $result

IFS существует для того, чтобы избежать путаницы с пробелами и окончаниями строк, интерпретируя их как границы элементов. (Без этого вы получите echo $result, который выдает все бесполезно в одну строку.)

Но подстановочный знак расширяется, и в зависимости от того, сколько файлов соответствует глобу, вы можете получить команду, которая слишком длинна для обработки. Вам почти наверняка лучше использовать find, но это также зависит от того, для чего вы хотите содержимое этих файлов. Может быть более простой способ сделать то, что вы пытаетесь выполнить, не сохраняя сначала содержимое всех файлов в промежуточной переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...