В bash $0
содержится имя скрипта, но в awk, если я сделаю скрипт с именем myscript.awk со следующим содержанием:
#!/usr/bin/awk -f
BEGIN{ print ARGV[0] }
и запустить его, он будет печатать только «awk». Кроме того, ARGV [i] с i> 0 используется только для аргументов скрипта в командной строке. Итак, как заставить его напечатать имя скрипта, в данном случае «myscript.awk»?
mawk
по умолчанию в Ubuntu? На моей 15.04 ВМ значение по умолчаниюawk
-gawk
. Хотя mawk установлен, он не используется по умолчанию.awk -f myscript.awk
. Однако это не связано с рассматриваемой проблемой.awk
скрипт, потому что он начинается с#!/usr/bin/awk -f
. Скрипты оболочки начинаются с#!/bin/sh
(или чего-то подобного).awk -f file
.Ответы:
С GNU awk 4.1.3 в bash на cygwin:
Я не знаю, насколько это портативно. Однако, как всегда, я бы не стал выполнять сценарий awk, используя shebang в сценарии оболочки, поскольку он просто лишил вас возможной функциональности. Сохраняйте это простым и просто сделайте это вместо этого:
Этот последний будет работать с любым современным awk в любой оболочке на любой платформе.
источник
ENVIRON["_"]
работает отлично, и не вызывает никаких внешних программ. Второй вариантawk -v ...
зависит от того, как запускается скрипт; Я не хочу этогоtst.sh
вводит в заблуждение. Этоawk
сценарий, а не сценарий оболочки.BEGIN
не является допустимой командой оболочки.ENVIRON["_"]
создает ли путь сценария вызывающей оболочки при печати из каждого awk, вызываемого через shebang из каждой оболочки»? Я бы никогда не назвал сценарий awk из шебанга, мне лично наплевать на ответ, а просто подумал, что упомяну его… О, я вижу в комментариях выше, что @cuonglm ответил, что он поддерживается только в некоторых оболочках. ,*12345*/tmp/test.awk
.ARGV[0]
надежно всегдаawk
в dash, bash, zsh и ksh93.Я не думаю, что это возможно согласно
gawk
документации :На
linux
вас может попытаться использовать вид грязный хака и как указано в комментариях Stéphane Chazelas это возможно , если реализацияawk
опора NUL байт:источник
gawk
и терпит неудачу (как ваше описание) сmawk
. Интересный!awk
- 4.0.2. В freebsd с/proc/curpoc/cmdline
, иawk
результат похож на ваш, но работает сgawk
.awk -vNAME="myscript.awk" ./myscript.awk
а затем напечатать NAME внутри скрипта. Не решениеЯ не знаю прямого способа получить имя команды из awk. Однако вы можете найти его через вложенную оболочку.
простак
С помощью GNU awk и
ps
команды вы можете использовать идентификатор процессаPROCINFO["PID"]
для получения имени команды в качестве обходного пути. Например:cmdname.awk
mawk и nawk
Вы можете использовать тот же подход, но получить
awk
PID из$PPID
специальной переменной оболочки (PID родителя):cmdname.awk
тестирование
Запустите скрипт так:
Вывод в обоих случаях:
источник
gawk
этоgawk
решение, а неawk
решение. Я думаю, что @cipper должен добавить свое желание "портативное решение" к вопросу.awk -vNAME="myscript.awk" ./myscript.awk
а затем напечатать NAME внутри скрипта. Не решениеС POSIX
awk
:Потом:
источник
awk -vNAME="myscript.awk" ./myscript.awk
а затем распечатать переменнуюNAME
внутри скрипта. Не решениеmawk
. И также использованиеENVIRON
не то же самое, что использование-vNAME="myscript.awk"
, так как , когдаmawk
будет расширяться escape-последовательность вNAME
.Использование GNU awk
Проверка руководства пользователя GNU awk - 7.5.2 Встроенные переменные, передающие информацию, на которую я наткнулся:
Это означает, что вы можете знать PID программы во время выполнения. Затем, это вопрос использования
system()
для поиска процесса с данным PID:Я использую
ps -ef
, который отображает PID на 2-й столбец. Предполагая, что выполнение g выполнено,awk -f <script>
а других параметров нет, мы можем предположить, что последнее поле строки содержит информацию, которую мы хотим.Если бы у нас были какие-то параметры, мы должны были бы проанализировать строку по-другому - или, лучше, использовать некоторые параметры
ps
для печати только тех столбцов, которые нам интересны.Тестовое задание
Также обратите внимание, что в другой главе руководства пользователя GNU awk говорится, что ARGV - это не тот путь:
источник
mawk
и не мог заставить его работать, так что я установилgawk
в Ubuntu, и это сработало. Таким образом, обходной путь можно использоватьgawk
: Dgawk
по умолчанию не устанавливается в Ubuntu (или, по крайней мере, в некоторых версиях Ubuntu, гдеmawk
этоawk
реализация по умолчанию ). IIRC, мне пришлось установить его и на Debian.