2

Я хотел бы остановить свой сценарий оболочки, если пользователь в данный момент не является каталогом сценария оболочки. Например, я нахожусь в папке ~/ и вызываю сценарий оболочки ~/shell/script.sh , сценарий оболочки должен печатать. You are not allowed to call this shell script from another folder other than its directory . Но если я нахожусь в папке ~/shell и вызываю ./script.sh то выполнение разрешено.

Почему тебя волнует, что такое $PWD ? Вы можете изменить каталоги в скрипте, если это имеет значение: cd "$(dirname "$0")"

Это очень локальный агрессивный / опасный скрипт, поэтому я бы хотел, чтобы пользователь присутствовал в папке, уделяя больше внимания этому при запуске скрипта.


Смежные вопросы:

  1. Проверьте, был ли скрипт bash запущен из оболочки или другого скрипта / приложения
  2. Исполняемые блоки запускаются при непосредственном вызове из терминала, но не работают при вызове из сценария оболочки

2 ответа2

1

Вы можете получить полный путь к исполняемому сценарию, используя realpath для разрешения неявного текущего каталога (для подробностей man realpath , опция -P может быть полезна):

mydir=$(dirname $(realpath $0))
[[ $PWD != $mydir ]] && { echo "Not in the right directory!"; exit 1; }
echo "OK, proceed..."
0

Спасибо @grawity, я написал это:

# Call the main function, as when running from the command line the `$0` variable is 
# not empty.
#
# Importing functions from a shell script
# https://stackoverflow.com/questions/12815774/importing-functions-from-a-shell-script
if ! [[ -z "$0" ]]
then
    # Reliable way for a bash script to get the full path to itself?
    # http://stackoverflow.com/questions/4774054/reliable-way-for-a-bash-script-to-get
    pushd `dirname $0` > /dev/null
    SCRIPT_FOLDER_PATH=`pwd`
    popd > /dev/null

    if[[ "$SCRIPT_FOLDER_PATH" == "$(pwd)" || "$SCRIPT_FOLDER_PATH" == "$(dirname "$0")" ]]
    then
        main "$@"
    else
        printf "You cannot run this from the folder: \n'$(pwd)'\n"
        printf "\nPlease, run this script from its folder on: \n'$SCRIPT_FOLDER_PATH'\n"
    fi
fi

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