Что делает "cd` echo $ 0 | sed 's / \ (. * \) \ /.*/ \ 1 /' `" в скрипте bash? - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь понять скрипт, написанный на примере квантового эспрессо . В нем я нашел это выражение:

# run from directory where this script is
cd `echo $0 | sed 's/\(.*\)\/.*/\1/'` # extract pathname

Но я не могу понять, что означает s/\(.*\)\/.*/\1/.

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Это разделитель пути, как сказано в разделе комментариев.

Небольшое пояснение к регулярному выражению:

s/                # sed mode

\(.*\)\/.*/       # A greedy capture group followed by a slash 
                  # '(.*)/.*', it will try to match as many characters
                  # as possible (include slashes) before the 
                  # last occurrence of '/'.
                  # A non-greedy modifier '?' will make it look for 
                  # the first occurrence of '/',
                  # as in  '(.*?)/.*'. All special charters are escaped
                  # here, I removed the '\'s for better readability.

\1/               # '\1' is referring back to the 'first capture group 
                  # in the regexp, so the 'sed' command replaces 
                  # the entire match with things between the first 
                  # pair of capturing parentheses.
0 голосов
/ 03 мая 2018

Используется регулярное выражение:

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

Поскольку вы используете регулярное выражение с помощью инструмента sed, вам нужно экранировать выражение: круглые скобки ( и ) становятся \( и \). \1 возвращает первую группу захвата. Что касается пути к файлу, это означает каталог, в котором находится файл.

Итак, этот скрипт получает папку, в которой он запущен, как указано @ Alex028502.

Я также рекомендую https://regex101.com/, веб-сайт, позволяющий вам бесплатно оценить свое регулярное выражение.

0 голосов
/ 03 мая 2018
echo $0 | sed 's/\(.*\)\/.*/\1/'

возвращает папку, в которой выполняется скрипт.

Например, если вы запускаете скрипт с именем /home/mike/test.sh, он дает вам /home/mike/

и вся команда превращается в этот каталог.

попробуйте это

echo this is where we started
pwd
cd `echo $0 | sed 's/\(.*\)\/.*/\1/'` # extract pathname
echo now we are here
pwd

А затем запустите скрипт из каталога, отличного от того, в котором он находится.

---- ответь на вопрос ---

sed 's/\(.*\)\/.*/\1/'

удаляет последний фрагмент пути

попробуйте это

echo this/is/a/test | sed 's/\(.*\)\/.*/\1/'
echo this/is/a/test/ | sed 's/\(.*\)\/.*/\1/'
echo this/is/a/test.sh | sed 's/\(.*\)\/.*/\1/'

и так как echo $0 должен дать вам файл (текущий скрипт), все выражение должно дать вам папку, в которой этот скрипт сохранен.

о том, как это работает, смотрите в ответе на тот же вопрос: https://stackoverflow.com/a/50148667/5203563

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