Это потому, что вы используете ${1}
без кавычек.
Решение проблем с цитированием может стать довольно сложным.
Замена '${1}'
на '"${1}"'
может помочь.
Сравните:
$ set -- "ab cd"; bash -c 'printf "<%s> " '${1}' "fd" "$0"'
<ab>
с:
$ set -- "ab cd"; bash -c 'printf "<%s> " '"${1}"' "fd" "$0"'
<ab> <cd> <fd> <bash>
Однако оболочка «удаление кавычек» по-прежнему применяется к значению переменной.
В качестве обходного пути вы можете использовать'"${1@Q}"'
$ set -- 'a"b c"d'; bash -c 'printf "<%s> " '"${1}"' "fd" "$0"'; echo
<ab cd> <fd> <bash> # quotes got lost.
$ set -- 'a"bc"d'; bash -c 'printf "<%s> " '"${1@Q}"' "fd" "$0"'; echo
<a"b c"d> <fd> <bash> # correct quotes.
Но, тем не менее, это не работает для двух циклов воздействия оболочки, которые есть у вашей команды (сначала на команду find
, затем на команду bash -c
):
$ mkdir 'a"bc"d' 'a"b c"d' 'a"bcd'
$ set -- 'a"bc"d'; find "./$1" -type d -exec bash -c 'printf "<%s> " fixperm "'"${1}"'" "fd" "$0"' {} >
<fixperm> <abcd> <fd> <./a"b c"d>
$ set -- 'a"b c"d'; find "./$1" -type d -exec bash -c 'printf "<%s> " fixperm "'"${1}"'" "fd" "$0"' {} >
<fixperm> <ab> <cd> <fd> <./a"b c"d>
$ set -- 'a"bcd'; find "./$1" -type d -exec bash -c 'printf "<%s> " fixperm "'"${1}"'" "fd" "$0"' {} \;
./a"bcd: -c: line 0: unexpected EOF while looking for matching `"'
./a"bcd: -c: line 1: syntax error: unexpected end of file
Однако на самом деле происходит путаница между $1
, являющимся параметром сценария, который вы вызываете, и тем, что $1
означает для оболочки, которая вызывается с помощьюbash -c
Линия:
find "/mnt/Data/Shared/$1" -type d -exec bash -c '
fixperm "'"${1}"'" "fd" "$0"' {} \;
Следует читать:
find "/mnt/Data/Shared/$1" -type d -exec bash -c '
fixperm "$1" "fd" "$2"' bash-shell "$1" {} \;
Что делает цитирование прямым и более надежным.
Если внутри скрипта bash -c
нет цикла или другой сложной функции для запуска, почти все кавычки можно убрать и написать:
dir="/mnt/Data/Shared"
find "$dir/$1" -type d -exec fixperm "$1" fd {} \;
\r
в некоторых сообщениях является сильным намеком на то, что в файле есть окончания строк Windows.