Почему я не получаю значение, когда я вызываю функцию внутри другой в скрипте bash - PullRequest
2 голосов
/ 23 мая 2019

У меня есть функция, которая генерирует случайное имя файла

#generate random file names
get_rand_filename() {
  if [ "$ASCIIONLY" == "1" ]; then
    for ((i=0; i<$((MINFILENAMELEN+RANDOM%MAXFILENAMELEN)); i++)) {
      printf \\$(printf '%03o' ${AARR[RANDOM%aarrcount]});
    }
  else
    # no need to escape double quotes for filename
    cat /dev/urandom | tr -dc '[ -~]' | tr -d '[$></~:`\\]' | head -c$((MINFILENAMELEN+RANDOM%MAXFILENAMELEN)) #| sed 's/\(["]\)/\\\1/g'
  fi
  printf "%s" $FILEEXT
}
export -f get_rand_filename

Когда я вызываю его из другой функции

cf(){
              fD=$1
              echo "the target dir recieved is  " $fD

              CFILE="$(get_rand_filename)"
              echo "the file name is "$CFILE
}
export -f cf

, когда я вызываю

echo "$targetdir" | xargs -0 sh -c 'cf $1' sh

Я получаю FILEXT (без случайного имени файла)

, когда я звоню

cf "$targetdir"

Я получаю действительный результат

Мне нужно иметь возможность обрабатывать пробелы в$ targettdir и строка с именем файла.

1 Ответ

2 голосов
/ 23 мая 2019
echo "$targetdir" | xargs -0 sh -c 'cf $1' sh

Вы должны вызвать bash вместо sh.Экспорт функций является функцией bash.

$ foo() { echo bar; }
$ export -f foo
$ sh -c 'foo'
sh: 1: foo: not found
$ bash -c 'foo'
bar

Кроме того, избавьтесь от опции -0, поскольку вход не разделен NUL.Вместо этого используйте -d'\n'.И процитируйте "$1" для надежности.

echo "$targetdir" | xargs -d'\n' bash -c 'cf "$1"' bash

На самом деле, вы можете использовать -0, если измените формат ввода.

printf '%s\0' "$targetdir" | xargs -0 bash -c 'cf "$1"' bash

Для чего это стоит, mktemp создает случайные временные файлы и делает это безопасно.Он проверяет, что файл еще не существует, а затем создает его, чтобы никто другой не мог перехватить имя за доли секунды между генерируемым именем и его возвращением вызывающей стороне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...