2

У меня есть следующий раздел в моем скрипте bash:

# Move to script's source directory (in case it's being called from somewhere else)
cd $(dirname "${BASH_SOURCE[0]}")
# Save script's source directory
pwd=$(pwd)
# If it's not already ~/.cfg
if [ ! "$pwd" -ef ~/.cfg ]; then
        echo "Renaming directory"
        # Move up one level (since you can't rename directory while in it)
        cd ..
        # And rename it
        mv "$pwd" ~/.cfg
fi

Этот скрипт является установочным скриптом для репозитория git, который запускается сразу после его клонирования. Идея состоит в том, чтобы переместить весь репозиторий в ~/.cfg . Однако я получаю сообщение об ошибке

mv: невозможно переместить '/home/user/config' в '/home/user/.cfg': разрешение запрещено

Разрешения установлены соответствующим образом, и вызов того же mv из командной строки работает без проблем.

Я предполагаю, что проблема в том, что я переименовываю каталог, в то время как сценарий внутри него все еще работает, и просто выйти из него с помощью cd (как в приведенном выше фрагменте) недостаточно. Есть ли способ обойти это?


В конце концов оказалось, что я могу сделать что-то попроще, чем принятый ответ ниже, хотя в том же духе, что и удаление в самом конце.

Я просто изменил команду mv на cp -r , затем добавил rm -rf "$pwd" в самом конце скрипта. Очевидно , флаг rm -f «s игнорирует тот факт , что скрипт работает. Скрипт теперь работает как задумано.

1 ответ1

1

Я предлагаю иметь два сценария: один, который перемещает все, кроме первого, и другой, который просто перемещает первый сценарий и удаляет папку.

В конце первого сценария exec второй сценарий из нового местоположения. Это заменит процесс и закроет дескриптор первого скрипта. Этот второй сценарий может затем переместить первый сценарий и удалить пустую исходную папку.

Что-то вроде

# Move to script's source directory (in case it's being called from somewhere else)
cd $(dirname "${BASH_SOURCE[0]}")
# Save script's source directory
pwd=$(pwd)
# If it's not already ~/.cfg
if [ ! "$pwd" -ef ~/.cfg ]; then
        echo "Renaming directory"
        # Move up one level (since you can't rename directory while in it)
        cd ..
        # And rename it
        for i in "$pwd"; do
                if [ "$i" != "${BASH_SOURCE[0]}" ]; then mv "$i" ~/.cfg; fi
        done
        exec ~/.cfg/script2.sh "${BASH_SOURCE[0]}"
fi

Затем сценарий 2:

#!/bin/bash
# first arg is path to script you call it from.
base=basename "$1"
dir=dirname "$1"
mv "$1" ~/.cfg/$base
rmdir $dir

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .