исключение command not found при доступе к удаленному компьютеру через ssh

Это потому, что вы используете ${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 {} \;
1
27.05.2021, 12:59
1 ответ

\rв некоторых сообщениях является сильным намеком на то, что в файле есть окончания строк Windows.

2
28.07.2021, 11:28

Теги

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