получение текущего местоположения скрипта в bash (например, переменная __file__ python)

Достаточно просто, если известно, что само имя файла никогда не содержит косых черт или вопросительных знаков:

sed --in-place 's_http.*/img/\(.*\)?q=[0-9][0-9]*_\1_' inputfile

Если вам действительно нужны сайт и номера проблем, вы можете собрать свою команду sed, а затем реализовать ее как переменную:

sedcmd='s_http.*'$num1'.*'$num2'.*/img/\(.*\)?q=[0-9][0-9]*_\1_'
sed --in-place "$sedcmd" inputfile
2
11.05.2020, 13:52
2 ответа

В любой оболочке, подобной sh -, $0— это путь к исполняемому скрипту. Это задокументировано для bash в специальных параметрах . Это может быть относительный путь, и в этом случае он относится к текущему каталогу при запуске оболочки.

Обратите внимание, что $0не изменяется, когда скрипт выполняет другой скрипт с .или source. Более близким аналогом Python __file__, указывающим, какой файл содержит исполняемый в данный момент код, является $BASH_SOURCE. Руководство не очень понятно по этой теме, но $BASH_SOURCE— это имя файла, содержащего текущую исполняемую строку, даже для кода, который не находится в функции. Как и $0, $BASH_SOURCEможет быть относительным путем :, это то, что было передано встроенной команде ., и не изменится, если оболочка выполнит последующие команды cd.

1
28.04.2021, 23:15

Большинство ответов либо не обрабатывают файлы, связанные символическими ссылками через относительный путь, либо не являются одним -лайнером, либо не обрабатывают BSD (Mac ). Решение, которое делает все три,:

HERE=$(cd "$(dirname "$BASH_SOURCE")"; cd -P "$(dirname "$(readlink "$BASH_SOURCE" || echo.)")"; pwd)

Во-первых, перейдите cd к представлению bash о каталоге скрипта. Затем прочтите ссылку на файл, чтобы увидеть, является ли он символической ссылкой (относительной или иной ), и если да, перейдите в этот каталог. Если нет, перейдите в текущий каталог (, чтобы сохранить все в один -лайнер ). Затем повторите текущий каталог через pwd.

Вы можете добавить --к аргументам cd и readlink, чтобы избежать проблем с каталогами, названными как опции, но в большинстве случаев я не беспокоюсь.

Вы можете увидеть полное объяснение с иллюстрациями здесь (это мой сайт):

https://www.binaryphile.com/bash/2020/01/12/determining-the-location-of-your-script-in-bash.html

0
28.04.2021, 23:15

Теги

Похожие вопросы