В bash вы можете добавить все файлы в массив и echo
количество элементов в массиве:
arr=(*)
echo "${#arr[@]}"
Возможно, вы имели в виду:
export perl_script='
$| = 1;
s/\n/\r/g if $_ =~ /^AV:/;
s/Saving state/\nSaving state/'
mpv=(command mpv)
args=("$@")
sh -c '
"$@" 2>&1 |
perl -p -e "$perl_script" | tee ~/mpv_all.log
' sh "${mpv[@]}" "${args[@]}"
Или если вы хотите внедрить содержимое всех этих аргументов в виде шелл-кода:
shquote() {
LC_ALL=C awk -v q=\' '
BEGIN{
for (i=1; i<ARGC; i++) {
gsub(q, q "\\" q q, ARGV[i])
printf "%s ", q ARGV[i] q
}
print ""
}' "$@"
}
perl_script='
$| = 1;
s/\n/\r/g if $_ =~ /^AV:/;
s/Saving state/\nSaving state/'
mpv=(command mpv)
args=("$@")
sh -c "
$(shquote "${mpv[@]}" "${args[@]}") 2>&1 |
perl -p -e $(shquote "$perl_script") | tee ~/mpv_all.log"
Где shquote
заключает в кавычки свой аргумент в синтаксисе sh
(заключает аргументы в '...'
и заменяет '
на'\''
).
Это проще, если вам не нужно беспокоиться о том, что вызывающая оболочка делает со строкой, которая является строковым -сценарием оболочки. Вы можете использовать одинарные кавычки вокруг скрипта строки -и передать необходимый аргумент in в его командной строке :
.perl_script='$| = 1;s/\n/\r/g if $_ =~ /^AV:/;s/Saving state/\nSaving state/'
sh -c 'p=$1; shift
command mpv "$@" 2>&1 |
perl -pe "$p" |
tee "$HOME/mpv_all.log"' sh "$perl_script" "$@"