Linux скрипт путь до скрипта

Содержание
  1. 🐧 Как обнаружить внутри Bash скрипта путь, по которому он находится
  2. Что мы узнаем из статьи
  3. Что такое pwd?
  4. Итак, мы можем использовать pwd, верно?
  5. Решение
  6. Заключение
  7. You may also like
  8. 🐧 Проверка, содержит ли переменная число на Bash
  9. 📜 Преобразование символов в нижний регистр на Bash.
  10. ⏲️ Дата в формате ГГГГ-ММ-ДД в скриптах Shell
  11. Как определить, когда служба была запущена и остановлена.
  12. 📜 Shell скрипт для вывода пирамиды звезд
  13. 🌐 Shell/Bash скрипт для поиска простых чисел на.
  14. 🐍 Как создать игру “Змейка” на языке Python
  15. 🐧 Как распарсить логи истории apt
  16. 🐍 Как поменять местами две переменные в Python?
  17. 📜 Shell скрипты – удаление двойных кавычек (“”).
  18. Leave a Comment Cancel Reply
  19. • Свежие записи
  20. • Категории
  21. • Теги
  22. • itsecforu.ru
  23. • Страны посетителей
  24. IT is good
  25. Получение пути к скрипту для обращения к лежащим рядом файлам
  26. 1 ответ 1
  27. Where should I put my Bash scripts?
  28. 3 Answers 3
  29. If no other user other than you uses these scripts
  30. If these script are to be used by other users:

🐧 Как обнаружить внутри Bash скрипта путь, по которому он находится

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

Что мы узнаем из статьи

  • Что такое команда pwd и для чего она нужна
  • Как узнать изнутри Bash-скрипта, по какому пути находится тот же самый скрипт

Что такое pwd?

Где бы мы ни находились в настоящее время и по какому пути ранее переходили (или были помещены в него нашей операционной системой, как, например, когда мы открываем командную строку/терминал), будет текущим путем, когда мы выполним pwd.

$ cd / $ pwd / $ cd /home $ pwd /home

Также стоит отметить, что внутри скрипта Bash (а также в командной строке вне скриптов Bash) мы можем использовать специальную переменную операционной системы $, которая будет автоматически обновляться операционной системой, содержащей наш текущий путь.

Это избавляет нас от необходимости делать что-то вроде вызова подоболочки, т.е. MYPATH = “$(pwd)” не требуется, мы можем просто вызвать переменную $ .

Итак, мы можем использовать pwd, верно?

Не совсем. Представьте себе следующую ситуацию:

$ touch 'mypath.sh' $ echo '#!/bin/bash' >> mypath.sh $ echo 'echo $' >> mypath.sh $ chmod +x mypath.sh 
$ pwd /home/roel $ cd .. $ ./roel/mypath.sh /home

В то время как команда pwd внутри нашего скрипта mypath.sh работает правильно, здесь возникает проблема: pwd вернул путь, по которому мы сейчас находимся, а именно /home, тогда как скрипт фактически хранится в каталоге /home/roel!

Решение

В то время как в Bash нет специальной переменной для указания пути, в котором хранится скрипт, есть простой способ получить ее.

$ cd - /home/roel $ touch 'mypath2.sh' $ echo '#!/bin/bash' >> mypath2.sh $ echo 'MYPATH="$(cd "$(dirname $0)" && pwd)"' >> mypath2.sh $ echo 'echo "$"' >> mypath2.sh $ chmod +x mypath2.sh 

В него мы помещаем небольшой специальный код ($ (cd “$ (dirname $ 0)”; && pwd)), который найдет путь, по которому находится скрипт (путем перехода в его каталог на основе переменной $0 (которая является скриптом так, как мы его назвали, т. е. используя потенциальный относительный или полностью определенный путь) и запрашивая для него имя каталога (по ссылке; обратите внимание, что он все еще может быть относительным путем, если скрипт был запущен с использованием относительного пути), а затем переходя в него (через cd), а затем запрашивая pwd (рабочий каталог пути) для этого же, давая нам полный путь.

$ cd .. $ pwd /home $ ./home/mypath2.sh /home/roel

Скрипт работает правильно, и даже несмотря на то, что mypath2.sh был относительно вызван из-за пределов каталога, в котором находится скрипт, возвращаемый результат правильно отражает искомую информацию; путь, по которому лежит скрипт.

Читайте также:  Linux firewall web interface

Мы сохранили то же самое в переменной $, и теперь эту переменную можно использовать, например, для вызова $ /someotherscript.sh, где someotherscript.sh – другой скрипт в том же каталоге, что и mypath2.sh

Заключение

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

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

Затем мы ввели небольшой фрагмент кода (MYPATH = “$ (cd” $ (dirname $ 0) “ && pwd) “, который всегда будет возвращать каталог, в котором находится наш скрипт правильно.

itisgood
📜 Как использовать операторы Break и Continue в скриптах bash
📦 Разница между apt-get upgrade и dist-upgrade

You may also like

🐧 Проверка, содержит ли переменная число на Bash

📜 Преобразование символов в нижний регистр на Bash.

⏲️ Дата в формате ГГГГ-ММ-ДД в скриптах Shell

Как определить, когда служба была запущена и остановлена.

📜 Shell скрипт для вывода пирамиды звезд

🌐 Shell/Bash скрипт для поиска простых чисел на.

🐍 Как создать игру “Змейка” на языке Python

🐧 Как распарсить логи истории apt

🐍 Как поменять местами две переменные в Python?

📜 Shell скрипты – удаление двойных кавычек (“”).

Leave a Comment Cancel Reply

• Свежие записи

• Категории

• Теги

• itsecforu.ru

• Страны посетителей

IT is good

В этой статье вы узнаете, как удалить удаленный Git-репозиторий. Процесс прост, но его полезно запомнить, чтобы избежать неожиданностей в будущем. Git – это…

В 11-й версии своей операционной системы Microsoft серьезно переработала интерфейс и убрала несколько привычных функций. Нововведения не всем пришлись по душе. Мы дадим…

Продажа ноутбука нередко становится хлопотным занятием. Кроме поиска покупателя, продавцу необходимо подготовить устройство перед проведением сделки. Но если последовательно выполнить все шаги, ничего…

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

Вторичное жильё выгоднее для молодых семей, желающих приобрести свою первую квартиру. Сталкиваясь с ипотечным кредитованием, можно избежать много лишней суеты и проблем, если…

Источник

Получение пути к скрипту для обращения к лежащим рядом файлам

смысл в том, что в ОС есть понятие текущего каталога, все команды работают относительно него. Или меняйте каталог перед тем, как запустить скрипт или в самом скрипте пишите код по определению нужного каталога исходя из потребностей вашего проекта. например по месту нахождения текущего запущенного скрипта andrew.bogdanovs.com/post/bash_tricks_script_dir.html Причем первый подход кажется правильным, потому что если у вас на диске две разных проекта и в каждом лежит такой скрипт то при запуске скрипта просто по имени как вы поймете какой из них вы запустили ?

Читайте также:  Linux исправление ошибок жестких дисков

@Mike теперь тогда встаёт вопрос: как тогда сделать так чтобы скрипт запускался из папки в которой находится а не из корневой?

Если он запускается из корневой то я не понимаю почему dirname дает просто точку, он должен дать Folder. А вообще гугл сказал это stackoverflow.com/questions/3572030/…

1 ответ 1

у скрипта, интерпретируемого posix-совместимой «оболочкой», имеется переменная $0 , содержащая путь к этому скрипту.

проблема в том, что если он был запущен с указанием относительного пути, то именно этот относительный путь и попадёт в эту переменную.

например, при запуске ./скрипт (или sh ./скрипт ) в переменной будет записано именно ./скрипт .

да, конечно, программой pwd можно получить абсолютный путь к каталогу, в котором была выполнена эта команда, и, добавив к пути, возвращаемому программой pwd, относительного пути, взятого из переменной $0 , можно получить полный путь к скрипту.

например, если текущим каталогом при описанном выше запуске был /каталог , то полный путь получаем соединением того, что вернёт программа pwd ( /каталог ), добавлением / в конце, и содержимым переменной $0 ( ./скрипт ), резульат: /каталог/./скрипт . всё в порядке.

но это не сработает, если при вызове скрипта был указан абсолютный путь типа /какой/то/путь/скрипт . он попадёт в переменную $0 , и приставив к нему слева текущий каталог, мы получим неправильный результат: /каталог//какой/то/путь/скрипт .

также абсолютный путь попадёт в переменную $0 , если каталог, в котором лежит скрипт, присутствует в переменной окружения $PATH , а скрипт был запущен просто указанием имени, без какого-либо пути (запустили скрипт , в $0 получили полный путь, например, /usr/bin/скрипт ).

хорошо, если у вас операционная система gnu, ведь в ней имеется программа realpath, с помощью которой легко можно получить абсолютный путь в обоих ситуациях: realpath «$0» вернёт именно то, что нам требуется.

в других posix-совместимых операционных системах алгоритм получения пути такой:

  • если в переменной $0 находится абсолютный путь (т.е., он начинается с / ), то ничего слева добавлять не нужно.
  • иначе надо добавить слева то, что вернёт программа pwd .

вот простенькая реализация функции realpath, эмулирующей поведение программы gnu/realpath:

realpath() < local p=$1 if [ "$>" != "/" ]; then p="$(pwd)/$p" fi echo "$p" > # использование: realpath "$0" 

ну а получив абсолютный путь к скрипту, можно уже с помощью программы dirname получить каталог, в котором находится скрипт, а затем добавить к нему нужные элементы ( ../каталог и т.п.)

Источник

Where should I put my Bash scripts?

I have a few very simple Bash scripts that I cobbled together for things that I do regularly. One of them is to run duplicity to do my backup tasks. Nothing clever, just a bunch of if .. then statements really. As this needs to be run as root, would it be best practice to put my script in /usr/bin (or another location on PATH), chown to root:root and chmod to 700?

I would say use git to version-control your scripts, put local copies of the git repos somewhere you like in ~ , and then symlink the scripts into ~/bin .

@WinEunuuchs2Unix If you want your scripts to be available to other users, you should put them in /usr/local/bin . Otherwise, I would say just put them in ~/bin . Your own scripts in both directories should be safe when you upgrade.

Читайте также:  Office 365 and linux

As above, place them in /usr/local/bin. Just make sure your script names are unique & not an existing linux command/binary name. Myself just add a number to end of any script I create as I haven’t seen any pre-existing linux names end in a number. ( not to say some really obscure ones may.

@edwinksl Almost a year later I have to say ~/bin is the best place for most scripts as you don’t have to use sudo to edit them as you do when they are stored in /usr/local/bin .

3 Answers 3

If no other user other than you uses these scripts

Then you can keep them in /home/$USER/bin . Create the bin directory if it doesn’t exist and move the files there. The bin directory in your home will automatically get added to the PATH environment variable. The code is in the .profile :

# set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi 

Or in some systems it may be in .bashrc :

If these script are to be used by other users:

I save my own scripts in /opt/scripts .

If your script should executeable by every system user, you can create a symbolic link to /usr/bin .

If only root should execute the script, you can create a symbolic link to /usr/sbin .

Command to add a symbolic link in /usr/bin/ :

You can execute the script, because /usr/bin/ is in your PATH by default.

I would recommend that instead of using /usr/bin as the target for user/local shell script — that it be /usr/local/bin (or /opt/bin ) as per Filesystem Hierarchy Standard — Debian Wiki to avoid conflicts (most of the time, you want Ubuntu’s provided scripts to take precedence).

On most systems /usr/local/bin overrides /usr/bin , as it comes later in the path. This is on purpose, as the system does not put files there, so you can put files there, which SHOULD override the system provided ones.

I marked this as the correct answer, even though both answers seem fine. Reason is, I eneded up taking a look at the FHS docs and came away with the understanding that /opt is there for exactly this purpose. I like the idea of them simply sym linking to my scripts in /usr/local/bin. Thanks for all the pointers.

I have a directory that I use for the quick collection of my local tools or things that I deploy on various computers in /usr/local/apollo . There are branches off this directory for flags , bin and logs .

For the applications that I download and install outside of the default apt-get repositories are placed in /opt/ and a directory by the app’s name, with one more sub-directory for the specific version of the application. This way my compiled version of an application like vlc or eclipse won’t conflict with the distributed version.

My use of /opt is the way it’s basically officially designed.

By the way the directories /usr/local/bin , /usr/local/apollo , and /opt survives a fresh OS version installation overwrite.

Источник

Оцените статью
Adblock
detector