Использование псевдонимов с nohup

Почему не работает следующее?

$ alias sayHello='/bin/echo "Hello world!"'
$ sayHello 
    Hello world!
$ nohup sayHello
    nohup: appending output to `nohup.out'
    nohup: cannot run command `sayHello': No such file or directory

(причина, по которой я задаю этот вопрос, заключается в том, что я присвоил своим perl и python разные двоичные файлы perl/python, которые были оптимизированы для моих собственных целей; однако nohup доставляет мне проблемы, если я не укажу полный путь к моему perl/python двоичные файлы)


person asf107    schedule 15.02.2012    source источник
comment
попробуйте eval nohup sayHello (хотя я удивлюсь, если это сработает). Удачи.   -  person shellter    schedule 16.02.2012
comment
Как насчет того, чтобы поместить команду nohup в псевдоним: alias sayHello='nohup /bin/echo "Hello world"'   -  person orb    schedule 30.09.2013


Ответы (4)


Потому что оболочка не передает псевдонимы дочерним процессам (кроме случаев, когда вы используете $() или ``).

$ alias sayHello='/bin/echo Привет, мир!'

Теперь псевдоним известен в этом процессе оболочки, что нормально, но работает только в этом одном процессе оболочки.

$ sayHello 

Hello world!

Поскольку вы сказали sayHello в той же оболочке, это сработало.

$ nohup sayHello

Здесь программа nohup запускается как дочерний процесс. Поэтому он не получит псевдонимы. Затем он запускает дочерний процесс sayHello, который не найден.

Для вашей конкретной проблемы лучше сделать новый perl и python максимально похожим на обычный. Я бы предложил задать путь поиска.

В свой ~/.bash_profile добавьте

export PATH="/my/shiny/interpreters/bin:${PATH}"

Затем повторно войдите в систему.

Поскольку это переменная среды, она будет передаваться всем дочерним процессам, независимо от того, являются ли они оболочками или нет — теперь это должно работать очень часто.

person Danny Milosavljevic    schedule 15.02.2012
comment
Поэтому он не получит псевдонимы. Я думал, дочерний процесс, типа (echo "TheAlias=$(alias sayHello;sayHello)")&wait, не работает, похоже, что псевдоним не применяется, но присутствует; Интересно, может ли быть какой-то способ применить существующий псевдоним? - person Aquarius Power; 28.05.2015

Для bash: попробуйте сделать nohup 'your_alias'. Меня устраивает. Я не знаю, почему обратная цитата не отображается. Поместите свой псевдоним в обратные кавычки.

person chetan patel    schedule 02.11.2015

С помощью bash вы можете интерактивно вызывать подоболочку, используя параметр -i. Это будет источником вашего .bashrc, а также активирует опцию оболочки expand_aliases. Конечно, это будет работать только в том случае, если ваш псевдоним определен в вашем .bashrc, что является соглашением.

Справочная страница Bash:

Если указан параметр -i, оболочка является интерактивной.

expand_aliases: если установлено, псевдонимы расширяются, как описано выше в разделе Псевдонимы. Этот параметр включен по умолчанию для интерактивных оболочек.

Когда запускается интерактивная оболочка, не являющаяся оболочкой входа в систему, bash считывает и выполняет команды из /etc/bash.bashrc и ~/.bashrc, если эти файлы существуют.


$ nohup bash -ci 'sayHello'
person Travis Clarke    schedule 24.09.2017

Если вы посмотрите на раздел Псевдонимы руководства по Bash, говорит

Первое слово каждой простой команды, если оно не заключено в кавычки, проверяется на наличие псевдонима.

К сожалению, похоже, что bash не имеет ничего похожего на zsh. глобальные псевдонимы, которые раскрываются в любой позиции.

person jjlin    schedule 15.02.2012