Для Ubuntu-Debian можно использовать Partprobe (http://www.cyberciti.biz/tips/re-read-the-partition-table-without-rebooting-linux-system.html), но если Вы хотите к обнаруженному весь LUN (также программное обеспечение RAID), я предпочитаю scsitools
пакет (команда: sudo rescan-scsi-bus
).
Подстановочный шаблон, который не соответствует никакому файлу, оставляют нерасширенным. Намерение состоит в том, чтобы позволить вводить аргумент команде, которая содержит подстановочные символы, но не предназначается, чтобы быть шаблоном. Это делает некоторую капельку смысла на командной строке, где это позволяет сохранять два символа кавычки иногда. В сценарии это является очень раздражающим. К сожалению, нет никакого способа изменить это поведение в традиционном sh. Можно проверить, оставили ли шаблон нерасширенным.
for f in "../$package/${package}Setup"/*/*/*.msi; do
if [ "$f" = "../$package/${package}Setup"/*/*/*.msi" ]; then
# No match
break
fi
…
done
Bash может быть проинструктирован для расширения подстановочного шаблона несоответствия до пустого списка. Измените свою строку хижины на #!/bin/bash
, и можно сделать это:
shopt -s nullglob
for f in "../$package/${package}Setup"/*/*/*.msi; do
…
В Вашем сценарии существуют другие проблемы. Путем Вы используете searchPath
переменная повредится, если будут пробелы или подстановочные символы (включая обратные косые черты) в $package
. Не уезжайте $searchPath
подстановки переменных закрыли кавычки. Всегда используйте двойные кавычки вокруг подстановок переменных, если Вы не хотите, чтобы они рассматривались как разделенный от пробела список шаблонов, который не имеет место здесь — $package
строка (требующий двойных кавычек) в то время как очевидное *
сделайте партию подстановочным шаблоном. Поместите шаблон непосредственно в for
цикл, как выше.
Для входа, вместо них echo
команды (которые испытывают недостаток в двойных кавычках вокруг подстановок переменных, таким образом, аргументы будут искажены), используют set -x
отображать каждую команду на stderr, поскольку это выполняется.
В какой-то момент в сценарии, Вы устанавливаете IFS=#
, но Вы никогда не делаете никакого разделения на #
. Не устанавливать IFS
если Вы не собираетесь использовать его.
Существует несколько проблем с mode=$(echo $file | sed -e 's:.*/.*/\(.*\)/.*\.msi:\1:')
. Как объяснено выше, это испытывает недостаток в двойных кавычках вокруг "$file"
. Кроме того, вызов дополнительного sed
чтобы каждый файл обработал, является медленным (выполнение внешних процессов является медленным на Cygwin) и чрезмерно сложным. Оболочка имеет строковые конструкции обработки; в то время как они примитивны, они достаточны здесь. Ваш
dir="${file%/*}"
mode="${dir##*/}"
dir="${dir%/*}"
version="${dir##*/}"
Этот сценарий имеет набор проблем, но поведение, о котором Вы спрашиваете, почему цикл выполняется, является этим:
В конструкции оболочки
for f in <expr>; do <commands>; done
шаблон файла часто используется для "expr", который затем заменяется именем файла оболочки globbing, и именно это Вы сделали. Но Ваше выражение ничему не соответствует, таким образом, globbing не разворачивает его в список путей к файлам. Но это также не нулевая длина (пустой) список как на многих других языках, а скорее является выражением пути со звездочками, которые Вы повторяете чуть выше цикла. Таким образом, цикл выполняется однажды с набором $f, равным нерасширенной строке, заканчивающейся в *.msi. Вы видите это, где Вы повторяете его перед циклом. Мы знаем, что это ничему не соответствует, потому что Вы также используете его с ls, и именно поэтому Вы не получаете "Такой файл или каталог" ошибка.
(Обратите внимание также использование $file в цикле, и я думаю, что Вы означаете использовать $f там.