У меня есть следующий сценарий удара, чтобы сделать ряд каталогов, переместиться в тот каталог, выполнить некоторые действия (не показанный) и попятиться до родительского каталога:
#!/bin/bash
if [ -e 'dump' ]; then
rm -r dump
mkdir dump
D="dump/var"
else
mkdir dump
D="dump/var"
fi
for d in {1..24}
do
echo $D$d
mkdir $D$d/
cd $D$d
cd ..
done
Когда этот сценарий выполняется, результат состоит в том, что нечетные каталоги сделаны, в то время как четные каталоги бросают ошибку 'Никакой такой файл или каталог'. Если я вставил опцию сделать родительский каталог, как в mkdir -p $D$d/
, заканчивается вложенный каталог dump/var1
, dump/dump/var2
, dump/dump/dump/var3
, и так далее.
Если я удаляю изменения каталога, cd $D$d
и cd ..
, затем сценарий выполняется без ошибки. Если я использую полные пути для каталога, как в D="/path/to/directory/dump/var"
, затем нет 'Никакого такого файла или каталога' для всех кроме первого созданного каталога.
Что происходит в оболочке?
Ядро проблемы: Ваш сценарий cd
назад к dump
, не к dump/
родитель.
На первом повторении:
dump
родительский каталог, где dump/
существуетdump/var1
создается cd
в dump/var1
. cd ..
происходит Вы возвращаетесь к dump/
. Текущий рабочий каталог dump
и существует только var1
там, ничто иное.На втором повторении:
mkdir dump/var2/
Вы находитесь в dump/
и существует только var1
там. dump/
из dump/var2
несуществующий путь. Конечно, это перестало работать. Следовательно сообщение об ошибке и следовательно дубликат dump/dump/var2
когда Вы используете mkdir -p
флаг.cd ..
, таким образом, перед 3-м повторением текущий рабочий каталог изменяется от dump/
кому: dump/
родитель. Для 3-го повторения:
dump/
родительский каталог, путь dump/
существует, следовательно mkdir dump/var3
не перестанет работать. cd dump/var3
происходит, затем cd ..
, и что ток работает каталог теперь? dump/
, один уровень выше dump/var3
, где Вы пытаетесь сделать mkdir dump/dump/var4
, но существует только var1
и var3
там, нет dump
. mkdir
сбои, Вы cd ..
который идет один уровень выше dump/
, и все это повторяется снова. Вы видите это ясно при выполнении нашего сценария с set -x
для отладочной информации, добавленной после #!/bin/bash
строка или путем выполнения pwd
как первая команда на каждом повторении сценария.
Путем я рекомендовал бы исправить Ваш сценарий, через cd
в dump/
во-первых, и затем выполненный для цикла. Другими словами:
cd "$D"
for i in {1..24}
do
mkdir "$i"
cd "$i"
# do whatever you want inside "$i"
cd ..
done
Среди прочего я предложил бы использовать [ -d "dump" ]
вместо -e
, потому что это поможет Вам удостовериться файл, который существует, на самом деле каталог, хотя это могло бы взять дополнительные соображения.