1

Я хочу вызвать shell-скрипт / приложение внутри другого скрипта. Каждая строка содержащегося скрипта должна содержать два пробела. Это возможно?

Вывод должен выглядеть примерно так.

I'm the main-scripts' output.
  I'm a second script, called inside the main-script.
  Every line of my output is indented by 2 spaces.
  This is not implemented inside of me, but in the main-script
  as I should also be called outside of the main-script and then
  my output shouldn't be indented.
Thats all from the second script.

Это возможно и как?

2 ответа2

1

Как всегда в Unix, есть варианты.

paste

Используйте утилиту paste с пустым файлом LHS, например:

cat ~/.bashrc | paste /dev/null -

Команда cat является заполнителем для вашего второго скрипта.

Команда paste разработана, чтобы взять два файла и собрать их вместе, например:

$ paste file1 file2
file 1 line 1    <TAB>  file 2 line 1
file 1 line two  <TAB>  file 2 line 2
file 1 line 3    <TAB>  file 2 line iii

То, как я использую это выше, - это использовать /dev/null качестве file1 , а STDIN качестве file2 , заданный - . При использовании в качестве входных данных /dev/null возвращает символы NULL. Это означает, что каждой строке file2 , выводу вашего второго скрипта, предшествует NULL, за которым следует символ TAB.

Вы можете пойти дальше: paste имеет параметр --delimiter , но указание двух пробелов не дает ожидаемого эффекта: разделитель 1 используется между первым и вторым столбцами, разделитель 2 используется между вторым и третьим и т.д.

paste|expand

Чтобы получить отступ с двумя пробелами, вы должны снова использовать обычную paste каналу через команду expand -2: это превращает все вкладки в два пробела:

cat ~/.bashrc | paste /dev/null - | expand -2

Это будет вести себя точно так, как вы указали.

sed или awk

Еще один подход заключается в использовании sed или awk:

cat ~/.bashrc | sed 's/^/  /'

Это ищет начало строки (" ^ ") и заменяет или действительно вставляет пару пробелов.

cat ~/.bashrc | awk '{printf "  %s\n",$0}'

Он берет каждую полную строку (« $0 ») и форматирует ее с помощью printf , используя спецификатор формата из двух пробелов, за которым следует строка для печати, за которой следует новая строка.


Имейте в виду, что все вышеперечисленные команды могут исключить часть cat конвейера, например paste /dev/null ~/.bashrc или paste /dev/null ~/.bashrc|expand -2 , равно как sed 's/^/ /' ~/.bashrc или awk '{printf " %s\n",$0}' ~/.bashrc . Часто в качестве ошибки новичка принято использовать cat первым в конвейере.

1

Вы можете использовать sed или awk для этого. Например, в вашем основном скрипте вы можете сделать:

# execute the command and pipe to sed
second-script | sed 's/\(.*\)/  \1/'

Приведенная выше команда sed просто добавляет два пробела к каждой строке вывода из second-script .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .