В чем разница между & ldquo; источником x & rdquo ;, & ldquo ;. х & Rdquo; и & ldquo;. / x & rdquo; в Баше?

Вы используете неправильный ppa. Ppa изменен с

ppa:fkrull/deadsnakes на ppa:deadsnakes/ppa

Мы можем ясно видеть это, если посмотреть на технические детали ppa: apt следует посмотреть на [ ! d2] http://ppa.launchpad.net/deadsnakes/ppa/ubuntu ...

для доступных пакетов, а не

http://ppa.launchpad.net/fkrull/deadsnakes/ubuntu
1
задан 8 January 2013 в 21:41

2 ответа

Три способа:

Вы можете заключить скрипт в функцию и использовать только return.

#!/usr/bin/env bash
main() {
    ...
    return 1
    ...
}
main "$@"

Вы можете проверить, работает ли сценарий с помощью интерактивной оболочки.

if [[ $- = *i* ]]; then
    return 1
else
    exit 1
fi

Вы можете попытаться вернуться, и если это не удастся, выйдите.

return 1 2>/dev/null || exit 1
4
ответ дан 25 May 2018 в 13:55
  • 1
    Любые подсказки о том, как работает магическое заклинание $- = *i* ? – deadbeef404 9 May 2016 в 09:47
  • 2
    @ deadbeef404 Специальный параметр - содержит текущие активные флаги параметров. Тест проверяет, активен ли флаг -i. См. gnu.org/software/bash/manual/html_node/Special-Parameters.html – geirha 9 May 2016 в 15:22

Подумайте о команде «источник», как в заявлении «include». Он принимает содержание аргумента и запускает его так, как если бы он запускался напрямую. В этом случае ваша команда является «источником» с аргументом «run.sh», а run.sh выполняется точно так же, как если бы вы набрали содержимое run.sh в свою командную строку.

Когда вы run './run.sh', './run.sh' - ваша команда, и у нее нет аргументов. Поскольку этот файл является текстовым, а не бинарным, ваша оболочка ищет интерпретатора в shebang ('#!' В первой строке) и находит '/ bin / bash'. Итак, ваша оболочка запускает новый экземпляр bash, и содержимое run.sh запускается внутри этого нового экземпляра.

В первом случае, когда bash достигает команды «exit», она выполняется точно так же, как если бы вы набрали его в командной строке. Во втором случае он выполняется в процессе bash, в котором запущена ваша оболочка, поэтому только этот экземпляр bash получает команду «exit».

Когда вы вводите строку в bash, все, что перед первым пространством рассматривается как команда и все, что следует за ними, рассматриваются как аргументы. Команда '.' является псевдонимом «источника». Когда вы запустите ». run.sh ''. ' является собственной командой, поскольку она отделена от аргументов пробелом. Когда вы запускаете «./run.sh», ваша команда «./run.sh» и «.» является частью относительного пути к run.sh с '.' представляя вашу текущую папку.

1
ответ дан 25 May 2018 в 13:55
  • 1
    Если вы программист на C / C ++, который хочет улучшить работу с скриптами shell / bash, это идеальный ответ. – Justin 18 January 2016 в 21:10

Другие вопросы по тегам:

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