Si entiendo lo que está tratando de hacer, está usando una herramienta demasiado poderosa para el trabajo. En lugar de generar una sesión tmux
dedicada solo para un solo script simple, ejecute ese script desde la línea de comando usandonohup
&
y disown
.
nohup tdm DRT & disown
What does an awk script expect its command line arguments to be? Why does it expect arg1 to be the input file?
awk
Правила, основанные на шаблонах, требуют ввода. Когда начинается обработка этих частей вашей программы, awk
начинает использовать аргументы в виде имен файлов (или стандартного ввода, если имена файлов не указаны ).
До этого шага вы можете делать все, что хотите, с заданными аргументами в блоке BEGIN
.
Думаю, эти небольшие примеры помогут вам начать работу:
$ cat a.awk
#!/usr/bin/awk -f
BEGIN {
i=1
while( i in ARGV )
print ARGV[i++]
}
a.awk
имеет только блок BEGIN
и не содержит правил, основанных на шаблонах. awk
не нуждается в файлах и поэтому не использует данные аргументы в качестве имен файлов:
$./a.awk poit --zort -troz narf
poit
--zort
-troz
narf
Вам решать, что с ними делать.
Если вы хотите, чтобы файлы, основанные на шаблонах, обрабатывались в качестве аргументов, вам необходимо удалить все аргументы, которые вы использовали в блоке BEGIN
:
$ cat b.awk
#!/usr/bin/awk -f
BEGIN {
if( ARGV[1] == "--tolower" ) { cmd = "tr A-Z a-z" ; delete ARGV[1] }
else if( ARGV[1] == "--toupper" ) { cmd = "tr a-z A-Z" ; delete ARGV[1] }
else cmd = "cat"
}
{
print | cmd
}
Пример работы без опции:
$./b.awk a.awk
#!/usr/bin/awk -f
BEGIN {
i=1
while( i in ARGV )
print ARGV[i++]
}
Пример работы с опцией --toupper
:
$./b.awk --toupper a.awk
#!/USR/BIN/AWK -F
BEGIN {
I=1
WHILE( I IN ARGV )
PRINT ARGV[I++]
}
AWK ожидает, что его аргументы будут либо текстом сценария, либо -f
, за которым следует имя файла, содержащего запускаемый сценарий, в обоих случаях необязательно за которым следуют имена обрабатываемых файлов.
Это объясняет, почему вам нужно -f
в строке shebang :без этого, AWK считает, что имя файла вашего скрипта само по себе является операторами AWK для запуска.
Что касается обработки аргументов, программа AWK может выполнять свою собственную обработку аргументов, если она того пожелает. Ваш скрипт не работает из-за строки {print $0}
:, которая указывает интерпретатору читать каждую строку со своего ввода (файлов, названных в командной строке, поскольку вы указали некоторые )и обрабатывать их в соответствии с инструкции в блоке. Если вы удалите эту строку, вы не получите никаких ошибок. Вы можете обработать аргументы в BEGIN
и очистить ARGV
, чтобы он содержал только входные файлы; тогда AWK не будет жаловаться.
Попытка полностью самостоятельно обрабатывать аргументы и ввод, вероятно, означала бы игнорирование многих вещей, которые делают AWK таким полезным; если вы хотите сделать это, вы можете использовать Perl.
(Обратите внимание, что обработка shebang означает, что вы можете хранить простые скрипты AWK в их именах файлов, что позволяет избежать поиска умных имен для скриптов — не то, чтобы кто-то должен это делать...)
Сценарий awk
ожидает, что его аргументы командной строки, отличные от -option, будут именами файлов, над которыми сценарий должен действовать (, если они не заданы, он действует на стандартном вводе ).
Таким образом, когда вы используете #!/usr/bin/awk -f
в файле скрипта awk
, это сообщает системе, что текст самого файла должен быть передан в awk -f
.Любые другие аргументы командной строки будут интерпретироваться как входные файлы или как дополнительные флаги дляawk
:
#!/usr/bin/awk -f
BEGIN {
for (i in ARGV) {
printf("ARGV[%d] = %s\n", i, ARGV[i]);
}
printf("var = %s\n", var);
}
$./script.awk -vvar=hello ~/.profile
ARGV[0] = awk
ARGV[1] = /home/kk/.profile
var = hello
Проверка командной строки на наличие опций заканчивается на первом аргументе, не являющемся опцией:
$./script.awk ~/.profile -vvar=hello
ARGV[2] = -vvar=hello
ARGV[0] = awk
ARGV[1] = /home/kk/.profile
var =
Для того, чтобы awk
был полезен для чего-либо, ему нужны входные данные. Эти данные обычно поступают из одного или нескольких входных файлов, указанных в командной строке, или при отправке данных в стандартный входной поток.
Кроме блоков BEGIN
и END
, каждый блок в скрипте awk
будет применяться к каждой записи (каждой строки по умолчанию )входных данных по очереди.