Прежде всего, спасибо за ваш «выход». Это спасло мои волосы!
У меня была аналогичная проблема с Ubuntu 12.10. После связывания команды
sudo mdadm --detail /dev/md0
я увидел, что устройства рейда все еще синхронизируются. Другими словами, рейд по-прежнему считается деградированным, пока устройства не синхронизируются. После завершения синхронизации у меня не было проблем с загрузкой.
Надеюсь, это поможет!
Спасибо всем. Окончательная рабочая версия:
#!/bin/sh
# Script to fix permissions on supplied folder and file name
# including folders and filenames containing spaces
echo "Fixfilepermissions running"
echo "Enter Folder name"
IFS= read -r folder
echo "Folder name is "$folder
echo "Enter File name"
IFS= read -r filename
echo "File name is "$filename
fullpath="/home/abc/$folder/$filename"
echo "Full path is "$fullpath
echo "Command to be executed is: chmod a+rw -v \"$fullpath\""
echo -n "Is that correct (y/n)? "
read answer
if echo "$answer" | grep -iq "^y" ;then
chmod a+rw -v "$fullpath"
else
echo "No action taken"
fi
Цитаты ничего не означают read и будут отображаться в переменной. Котировки внутри переменной также являются просто регулярными символами: в обработке оболочки нет шага, где кавычки вступают в силу после расширения переменной.
Единственным исключением является то, что вы явно добавляете еще один слой обработки оболочки, либо запуская что-то вроде bash -c "$somevar", либо используя eval. Это не очень хорошая идея, поскольку, как правило, вы хотите избежать смешивания данных и кода.
Итак, вам нужно сделать следующее: 1) иметь read пропустите вход пользователя в переменную с как можно меньшим количеством изменений, а затем 2) используйте переменную в кавычках, чтобы передать ее из оболочки в команду без изменений.
read filename сам по себе в значительной степени ok, он обрабатывает пробелы в середине строки. Но он лишает ведущие и хвостовые пробелы и обрабатывает обратные косые черты как специальные символы. Чтобы отключить эти функции, используйте IFS= read -r filename.
При использовании этой переменной вы должны выполнить команду как chmod a+rw -v "$filename".
Вы не можете сохранить все это до переменная, ее невозможно будет правильно отделить. "$fixcommand" будет обрабатывать все значение как одну строку, имя команды. $fixcommand также разделит ваше имя файла. (BashFAQ 050 обсуждает сохранение команды переменной)
Всего:
IFS= read -r filename
fullpath="/home/abc/$folder/$filename"
echo "Command to be executed is: chmod a+rw -v \"$filename\""
# confirmation...
chmod a+rw -v "$filename"
В предоставленном вами скрипте переменные на самом деле не цитируются.
Вы должны обновить свой скрипт и указать переменные с помощью «»
Например:
fullpath="/home/abc/"$folder"/"$filename
переменные на самом деле не цитируются
fullpath="/home/abc/$folder/$filename"
Спасибо за @glenn jackman - кто предложил прочитать последствия безопасности, забывая процитировать переменную в bash / POSIX shell Ниже вы можете найти полную информацию о сайте проверки оболочки на вашем скрипте
Line 5:
read folder
^-- SC2162: read without -r will mangle backslashes.
Line 6:
echo "Folder name is "$folder
^-- SC2086: Double quote to prevent globbing and word splitting.
Line 8:
read filename
^-- SC2162: read without -r will mangle backslashes.
Line 10:
echo "File name is "$filename
^-- SC2086: Double quote to prevent globbing and word splitting.
Line 11:
fullpath="/home/abc/"$folder"/"$filename
^-- SC2027: The surrounding quotes actually unquote this. Remove or escape them.
Line 13:
echo "Full path is "$fullpath
^-- SC2086: Double quote to prevent globbing and word splitting.
Line 17:
echo "Command to be executed is "$fixcommand
^-- SC2086: Double quote to prevent globbing and word splitting.
Line 19:
echo -n "Is that correct (y/n)? "
^-- SC2039: In POSIX sh, echo flags are undefined.
Line 20:
read answer
^-- SC2162: read without -r will mangle backslashes.
Спасибо всем. Окончательная рабочая версия:
#!/bin/sh
# Script to fix permissions on supplied folder and file name
# including folders and filenames containing spaces
echo "Fixfilepermissions running"
echo "Enter Folder name"
IFS= read -r folder
echo "Folder name is "$folder
echo "Enter File name"
IFS= read -r filename
echo "File name is "$filename
fullpath="/home/abc/$folder/$filename"
echo "Full path is "$fullpath
echo "Command to be executed is: chmod a+rw -v \"$fullpath\""
echo -n "Is that correct (y/n)? "
read answer
if echo "$answer" | grep -iq "^y" ;then
chmod a+rw -v "$fullpath"
else
echo "No action taken"
fi
Цитаты ничего не означают read и будут отображаться в переменной. Котировки внутри переменной также являются просто регулярными символами: в обработке оболочки нет шага, где кавычки вступают в силу после расширения переменной.
Единственным исключением является то, что вы явно добавляете еще один слой обработки оболочки, либо запуская что-то вроде bash -c "$somevar", либо используя eval. Это не очень хорошая идея, поскольку, как правило, вы хотите избежать смешивания данных и кода.
Итак, вам нужно сделать следующее: 1) иметь read пропустите вход пользователя в переменную с как можно меньшим количеством изменений, а затем 2) используйте переменную в кавычках, чтобы передать ее из оболочки в команду без изменений.
read filename сам по себе в значительной степени ok, он обрабатывает пробелы в середине строки. Но он лишает ведущие и хвостовые пробелы и обрабатывает обратные косые черты как специальные символы. Чтобы отключить эти функции, используйте IFS= read -r filename.
При использовании этой переменной вы должны выполнить команду как chmod a+rw -v "$filename".
Вы не можете сохранить все это до переменная, ее невозможно будет правильно отделить. "$fixcommand" будет обрабатывать все значение как одну строку, имя команды. $fixcommand также разделит ваше имя файла. (BashFAQ 050 обсуждает сохранение команды переменной)
Всего:
IFS= read -r filename
fullpath="/home/abc/$folder/$filename"
echo "Command to be executed is: chmod a+rw -v \"$filename\""
# confirmation...
chmod a+rw -v "$filename"
В предоставленном вами скрипте переменные на самом деле не цитируются.
Вы должны обновить свой скрипт и указать переменные с помощью «»
Например:
fullpath="/home/abc/"$folder"/"$filename
переменные на самом деле не цитируются
fullpath="/home/abc/$folder/$filename"
Спасибо за @glenn jackman - кто предложил прочитать последствия безопасности, забывая процитировать переменную в bash / POSIX shell Ниже вы можете найти полную информацию о сайте проверки оболочки на вашем скрипте
Line 5:
read folder
^-- SC2162: read without -r will mangle backslashes.
Line 6:
echo "Folder name is "$folder
^-- SC2086: Double quote to prevent globbing and word splitting.
Line 8:
read filename
^-- SC2162: read without -r will mangle backslashes.
Line 10:
echo "File name is "$filename
^-- SC2086: Double quote to prevent globbing and word splitting.
Line 11:
fullpath="/home/abc/"$folder"/"$filename
^-- SC2027: The surrounding quotes actually unquote this. Remove or escape them.
Line 13:
echo "Full path is "$fullpath
^-- SC2086: Double quote to prevent globbing and word splitting.
Line 17:
echo "Command to be executed is "$fixcommand
^-- SC2086: Double quote to prevent globbing and word splitting.
Line 19:
echo -n "Is that correct (y/n)? "
^-- SC2039: In POSIX sh, echo flags are undefined.
Line 20:
read answer
^-- SC2162: read without -r will mangle backslashes.