полное имя скрипта и путь $ 0 не видны при вызове - PullRequest
4 голосов
/ 19 апреля 2011

У меня есть скрипт "task.sh" со следующим содержимым:

#!/bin/bash

CUR_DIR=`pwd`
SCRIPTPATH="${CUR_DIR}/`dirname $0`"

когда я вызываю его с помощью "bash task.sh", он работает как положено, но когда он вызывается с помощью ". Task.sh"

$ . log/task.sh 
dirname: invalid option -- b
Try `dirname --help' for more information.

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

Ответы [ 4 ]

6 голосов
/ 19 апреля 2011

Когда вы вызываете его как bash task.sh, bash присваивает «task.sh» значение $ 0 (из руководства по bash : «Если Bash вызывается с файлом команд [...], $ 0 равно установить имя этого файла. ").

Когда вы создаете исходный файл, bash не изменяет $ 0, он просто выполняет скрипт в текущей среде. Что в $ 0 в вашей нынешней среде?

$ echo "$0"
-bash

Начальная черта будет интерпретироваться dirname как опция.

Если это работа cron, зачем ты это делаешь?

Если вам нужен исходный текст вашего скрипта, это будет работать, если ваша оболочка bash:

SCRIPTPATH="${CUR_DIR}/${BASH_ARGV[0]}"

Однако оболочка cron, я полагаю, / bin / sh. Даже если / bin / sh является символической ссылкой на bash, когда bash вызывается как sh, он будет пытаться вести себя POSIXly: массив BASH_ARGV, вероятно, не будет вам доступен.

1 голос
/ 05 марта 2014

Когда вы набираете,

bash foo.sh

, вы выполняете скрипт foo.sh, а bash устанавливает входной аргумент $ 0 на имя запускаемого скрипта.

Когда выtype,

. foo.sh

Вы используете сценарий, и входной аргумент $ 0 не задан.В этой ситуации вы можете использовать автоматическую переменную $ _, которая содержит аргумент последней выполненной команды.В вашем скрипте вы можете ввести

SCRIPTPATH=$(dirname "$_")

, чтобы получить путь к foo.sh.Обратите внимание, что для того, чтобы это работало, это должна быть первая команда, выполненная в файле.В противном случае $ _ не будет содержать путь к исходному сценарию.

Престижность Деннис Уильямсон за предоставление этого ответа на аналогичный вопрос .

1 голос
/ 19 апреля 2011

Нет причин вызывать внешние двоичные файлы, такие как pwd и dirname при использовании bash.Функциональность этих двух двоичных файлов может быть реплицирована с использованием чистого синтаксиса оболочки.

Попробуйте выполнить следующее:

#!/bin/bash

CUR_DIR="$PWD"
SCRIPTPATH="${CUR_DIR}/${0#*/}"
0 голосов
/ 05 сентября 2018

Я давно пользуюсь этим без проблем.

SCRIPTPATH=$(cd `dirname -- $0` && pwd)

-- отключить дальнейшую обработку параметров.

...