Подтвердить что ты не робот

Запустите bash script как источник без исходной команды

Можно ли пометить script как "запустить как источник", поэтому вам не нужно добавлять source или ".". командовать им каждый раз? то есть, если я пишу script, называемый "sup", я бы назвал его

sup Argument

а не

source sup Argument

или

. sup Argument

В основном, я пытаюсь использовать cd в script.

4b9b3361

Ответ 1

Bash вилки и звезды перед ним или подобие, или ваше ядро ​​даже считает, что он должен делать там. Это не то, что вы можете "отменить". Так что нет, это невозможно.

К счастью.

Посмотрите на функции bash:

sup() {
    ...
}

Поместите это в свой ~/.bashrc.

Ответ 2

Когда вы запускаете оболочку, существует два способа вызвать оболочку script:

  • Выполнение a script создает новый процесс, в котором работает script. Это делается путем ввода имени script, если оно сделано исполняемым и начинается с

    #!/bin/bash
    line, or directly invoking
    /bin/bash mycmd.sh
  • Sourcing a script runs it inside its parent shell (i.e. the one you are typing commands into). This is done by typing

    source mycmd.sh
    or
    . mycmd.sh

So the cd inside a shell script that isn't sourced is never going to propagate to its parent shell, as this would violate process isolation.

If the cd is all you are interested about, you can get rid of the script by using cd "shortcuts"... Take a look into the bash doc, at the CDPATH env var.

Otherwise, you can use an alias to be able to type a single command, instead of source or .:

alias mycmd="source mycmd.sh"

Ответ 3

Создайте для него псевдоним:

alias sup=". ~/bin/sup"

Или вдоль этих строк.

Смотрите также: Почему cd не работает в оболочке bash script?


Ответ на комментарий по встречному примеру: эксперимент с Korn Shell на Solaris 10 показывает, что я могу сделать:

$ pwd
/work1/jleffler
$ echo "cd /work5/atria" > $HOME/bin/yyy
$ alias yyy=". ~/bin/yyy"
$ yyy
$ pwd
/work5/atria
$

Экспериментация с bash (3.00.16) на Solaris 10 также показывает то же поведение.


Ответ 4

Невозможно создать script в вашей текущей среде, если вы вызываете script при вызове.

Однако вы можете проверить, что script находится в ресурсе, и принудительно завершать script, если нет:

if [ -z "$PS1" ] ; then
    echo -e "This script must be sourced. Use \"source <script>\" instead."
    exit
fi

Точно так же вы можете принудительно отключить script, но вместо этого заменить его (сохранить текущую среду оболочки):

if [ "$PS1" ] ; then
    echo -e "This script cannot be sourced. Use \"./<script>\" instead."
    return
fi

Обе версии доступны в виде gists: см. пожалуйста, источник и don ' t источник.