Вы можете создать такой скрипт:
#!/bin/bash
vars=()
i=1
for arg in "$@"; do
vars+=(-v "var$i=$arg")
i=$((i+1))
done
awk "${vars[@]}" -f/dev/fd/3 3<< EOF
BEGIN {
printf "awk var1: %s\n", var1;
printf "awk var2: %s\n", var2;
}
1
EOF
, а затем запустите его:
$ echo some input |./awk.sh foo bar doo
awk var1: foo
awk var2: bar
some input
Сценарий оболочки создаст командную строку из этих -v var1=...
аргументов и передаст их в awk
, с фактической программой awk через здесь -документ (, конечно, вы могли бы иметь awk-скрипт вместо этого в отдельный файл ). Тем не менее, вы не можете передавать имена входных файлов таким образом, вы вынуждены читать awk-скрипт со стандартного ввода.
По крайней мере, GNU awk явно документирует, что ARGV[n]
также используются в качестве входных файлов (https://www.gnu.org/software/gawk/manual/html_node/ARGC-and-ARGV.html), поэтому вы получаете ошибки «файл не найден».
Действительно старые tar
форматы хранят только числовые идентификаторы пользователей и групп, поэтому у них есть описанная вами проблема.
Однако, начиная со стандарта POSIX с 1988 года, tar
форматы, такие как стандарт Unix tar
, формат или pax
, также сохраняют имя пользователя и имя группы, поэтому они могут сохранять владение по имени.. Учитывая tar-архив, содержащий файл, принадлежащий uid 1234, с именем пользователя john
, tar
будет искать пользователя с именем john
и извлекать файл с этим владельцем, если возможно (, потенциально с uid, отличным от 1234 ), возвращаясь к uid 1234, если такого пользователя нет.
Ничто из этого не идеально, поэтому tar
не восстанавливает права собственности, если только он не запущен от имени пользователя root (, за исключением того факта, что для смены владельца в любом случае требуется root ); по умолчанию файлы извлекаются с правом собственности работающего пользователя.