Vaclav_ Ответов: 1

Bash script - когда использовать подстановку команд и когда перенаправление ?


Я только начал использовать скриптовый язык bash, и у меня возникли проблемы с пониманием "замены команд" и "перенаправления". Я очень часто использую bash man и кое-что знаю об этом конкретном предмете.

Вот пример использования подстановки команд.

Я использовал команду "sed", чтобы найти номера строк в файле, где шаблон "выбор" совпадает.
Как обычно, "sed" выводится в stdout, или переменная / файл "индекс" может быть "извлечена" с помощью подстановки команд. Что я и сделал, и это работает, как и ожидалось.

index=$(sed -n "/$choice/=" "$PWD$DEBUG_DIR$DEBUG_MENU")


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

Что я уже пробовал:

Да, я попробовал "перенаправление", но оно не сработало так, как ожидалось.

sed -n "/$choice/=" "$PWD$DEBUG_DIR$DEBUG_MENU" >> индекс

1 Ответов

Рейтинг:
10

Richard MacCutchan

Хорошо, продолжу с моего предыдущего сообщения:

1. "Да, я попробовал "перенаправление", но это не сработало, как ожидалось."
Это один из самых неприятных комментариев, которые мы видим в вопросе. Мы понятия не имеем, что вы ожидали увидеть или что произойдет. И мы понятия не имеем, что произошло. Без четкого объяснения того, что вы ожидали и какой результат получили, мы действительно не можем помочь.

2. вы смешиваете замену команд и перенаправление, поэтому неясно, что является большой проблемой. Перенаправление довольно простое, оно позволяет отправлять выходные данные команды в файл вместо консоли, чтобы вы могли прочитать их позже в своем редакторе. Он также позволяет отправлять содержимое файла в качестве входных данных для команды. Так что команда вроде:

ls -l > foo.txt

отправляет выходные данные из команды list в файл foo.txt-да. Вы также можете использовать трубу | чтобы отправить выходные данные из одной команды в качестве входных данных в другую. Таким образом
ls -l | grep "foo"

отправляет выходные данные команды ls в качестве входных данных в grep, который будет перечислять все файлы, содержащие строку 'foo'.

3. Что касается подстановки команд, то здесь используется конструкция $(command) который работает command и заменяет собой $(command) в скрипте с фактическим результатом выполнения команды. Так что в вашем заявлении выше
index=$(sed -n "/$choice/=" "$PWD$DEBUG_DIR$DEBUG_MENU")

вы устанавливаете локальную переменную index, к результату высказываний в скобках. Это не то же самое, что передать его в файл.


Vaclav_

Я попросил объяснить, когда использовать замену команд или перенаправление.
Поскольку все в Linux - это файл, я предполагаю, что могу "перенаправить" из stdout в переменную-в данном случае "индекс".
Я уточнил, что действительно пытался это сделать.
В конце концов я выясню, как это сделать.

Richard MacCutchan

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

Как я уже упоминал выше, ваше заявление
index=$(sed -n "/$choice/=" "$PWD$DEBUG_DIR$DEBUG_MENU")
не создает файл, а создает локальную переменную окружения с именем index который содержит результат выполнения команды в круглых скобках.