Цитирование внутри «sh -c» с двойными кавычками

В bash вы можете добавить все файлы в массив и echo количество элементов в массиве:

arr=(*)
echo "${#arr[@]}"
0
11.04.2019, 01:28
2 ответа

Возможно, вы имели в виду:

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(заключает аргументы в '...'и заменяет 'на'\'').


2
28.01.2020, 02:18

Это проще, если вам не нужно беспокоиться о том, что вызывающая оболочка делает со строкой, которая является строковым -сценарием оболочки. Вы можете использовать одинарные кавычки вокруг скрипта строки -и передать необходимый аргумент 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" "$@"
2
28.01.2020, 02:18

Теги

Похожие вопросы