Вопрос или проблема
Я изучаю книгу “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-подобной системе.