Перенаправление вывода в скрипт bash

Вопрос или проблема

Я изучаю книгу “sed & awk” автора Догерти и Роббинса. Один из примеров предполагает перенаправление вывода в скрипт оболочки:

sed -f nameState list | byState

Но я обнаружил, что, чтобы это работало, мне нужно дать скрипту ‘byState’ права на выполнение с помощью chmod, а также вызывать его с помощью точка-слэш:

sed -f nameState list | ./byState

Будет ли это всегда так? Книга датируется 1997 годом, так что, возможно, стандарт оболочки изменился? Или это связано с тем, что я использую bash, а не sh?

ИЗМЕНЕНИЕ: Вот скрипт byState:

#! /bin/sh
awk -F, ’{
        print $4 ", " $0
        }’ $* |
sort |
awk -F, ’
$1 == LastState {
      print "\t" $2
}
$1 != LastState {
      LastState = $1
      print $1
      print "\t" $2
}’

Да. Если вы собираетесь вызывать скрипт таким образом, он должен быть помечен как исполняемый (и, ideally, иметь шебанг). Это не ново.

Ваш термин “точка-слэш” просто указывает путь к скрипту, одна точка представляет текущую директорию. Как указал @ilkachu, это вопрос безопасности включать “точку” в ваш путь, это приведет к тому, что любая директория, которая может быть $CWD в данный момент, появится в вашем пути поиска.

Ответ или решение

Пайпинг вывода в bash скрипт: Подробный анализ и рекомендации

При работе с концепцией пайпинга в Unix-подобных системах, важно понимать несколько ключевых аспектов, особенно в отношении выполнения скриптов, как упомянуто в обсуждении. В данной ситуации рассматривать будем команду:

sed -f nameState list | ./byState

Почему нужно делать скрипт исполняемым?

Вы уже заметили, что для выполнения вашего скрипта byState, его необходимо сделать исполняемым с помощью команды chmod. Это основа безопасности в Unix-подобных системах. Ваша команда, чтобы сделать файл исполняемым, выглядит так:

chmod +x byState

Важность Shebang

Ваша строка #! /bin/sh в начале скрипта является примером shebang. Она указывает операционной системе, какой интерпретатор использовать для выполнения скрипта. Отсутствие этой строки может привести к ошибкам выполнения, так как система не будет знать, как интерпретировать содержимое файла.

Дот-слэш (./) и структура PATH

Вы указали, что вызываете скрипт с помощью ./byState. Этот синтаксис не является новой практикой. Он нужен для явного указания на то, что файл находится в текущем каталоге. Это критически важно для безопасности, так как если бы вы просто ввели byState, система начала бы искать файл в каталоге, указанном в переменной окружения PATH. Отсутствие текущего каталога в PATH может предотвратить выполнение случайного или потенциально вредоносного скрипта.

Использование . в PATH считается небезопасным, так как может привести к выполнению нежелательных программ, если кто-то разместит их с одинаковым именем в рабочем каталоге. Поэтому, обозначая путь через ./, вы минимизируете риски.

Совместимость с различными оболочками

Как вы заметили, книга, с которой вы работаете, была издана в 1997 году. Тем не менее, требования к исполняемым правам и shebang оставались одинаковыми на протяжении десятилетий. Различия между bash и sh в этом контексте несущественны, так как обе оболочки следуют принципам UNIX. bash является лишь расширением sh, добавляющим множество дополнительных функций, но совместимость с базовыми скриптами остается.

Заключение

Ваша практика выполнения скрипта через пайпинг с sed является абсолютно корректной, но требует соблюдения правил безопасности и корректной конфигурации. Необходимо всегда принимать меры по явному указыванию путей и проверке прав доступа на исполняемые файлы. Это обеспечит правильное выполнение ваших скриптов, независимо от среды или использования оболочки.

Таким образом, использование команд chmod и ./ не только важны, но и являются стандартом для безопасной работы с вашими скриптами в любой Unix-подобной системе.

Оцените материал
Добавить комментарий

Капча загружается...