Вы уже знаете о -v variable=value
. Другой способ — передать переменные через окружение и прочитать их из массива ENVIRON
:
$ var1=hello var2=world awk 'BEGIN { print ENVIRON["var1"], ENVIRON["var2"] }'
hello world
Это устанавливает переменные среды var1
и var2
только в среде awk
.
Или,
$ export var1=hello var2=world
$ awk 'BEGIN { print ENVIRON["var1"], ENVIRON["var2"] }'
hello world
Это устанавливает переменные в вызывающей среде перед вызовом awk
.
Массив ARGV
содержит только имена файлов, из которых программа awk
будет последовательно читать, но он также может содержать имена переменных, заданные в командной строке, как в
awk '...' var1=value1 var2=value2 filename
Как правило, это не рекомендуемый способ передачи переменных в awk
хотя (эти переменные не будут доступны в блоке BEGIN
, например ).
Как насчет:
$ tar czf ~/files.tgz -T <(\ls -1 $des/bin/*.{c,h}pp)
tar
обрабатывает содержимое файла после флага -T
как файлы, подлежащие архивации, по одному в строке. Это работает на GNU tar
1.32.
Синтаксис <(cmd)
, где cmd
означает \ls -1 $des/bin/*.{c,h}pp
, называется подстановкой процесса(для получения дополнительной информации см. man bash
).
РЕДАКТИРОВАТЬ:если вам нужно, чтобы имена файлов не были полностью определенными (чтобы не включать их абсолютные пути )в ваш tar-шар, просто cd
в нужный каталог перед запуском команды tar
...
$ cd $des/bin; tar czf ~/files.tgz -T <(\ls -1 *.{c,h}pp)
ОБРАТИТЕ ВНИМАНИЕ, что указание интересующей директории с флагом -C
:
$ tar czf ~/files.tgz -C $des/bin -T <(\ls -1 *.{c,h}pp)
не работает . Хотя флаг -C
чувствителен к порядку -, т. е. влияет на все последующие флаги, он не применяется к подстановке процесса, как показано.
шарики расширяются оболочкой.tar
(по крайней мере некоторые tar
реализации )поддерживают подстановочные знаки, но только для фильтрации файлов для извлечения или перечисления из архива.
Итак, список файлов должен быть сгенерирован оболочкой, и если вам нужно, чтобы имена файлов, хранящиеся в архиве, не имели компонента каталога, вам нужно либо tar
, чтобы удалить его, (, у некоторых есть -s
или --transform
для этого ), или просто cd
в этот каталог перед созданием списка файлов.
Чтобы оставить выходной архив в исходном рабочем каталоге,вы можете использовать перенаправление и менять каталог только в подоболочке, как в:
(cd -P -- "$des/bin" && tar -zcvf - -- *.[hc]pp) > files.tar.gz
Или вы можете записать этот каталог перед изменением текущего рабочего каталога:
(dir=$PWD; cd -P -- "$des/bin" && tar -zcvf "$dir/files.tar.fz" -- *.[hc]pp)