Почему команда «at» всегда предупреждает меня, что команды будут выполняться через sh? - PullRequest
12 голосов
/ 08 октября 2008

Каждый раз, когда я использую команду «at», я получаю это сообщение:

warning: commands will be executed using /bin/sh

О чем он пытается меня предупредить? Что еще более важно, как я могу отключить предупреждение?

Ответы [ 5 ]

12 голосов
/ 08 октября 2008

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

т.е.

username@hostname$ at 23:00     
warning: commands will be executed using /bin/sh
at> rm **/*.pyc
at> <EOT>
job 1 at 2008-10-08 23:00

Использование '**' вполне допустимо для zsh, но не для / sbin / sh! Эти ошибки легко допустить, если вы привыкли использовать другую оболочку, и вы обязаны не забывать делать правильные вещи.

5 голосов
/ 08 октября 2008

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

Теперь, если вы хотите просто не видеть его, вы можете использовать в [время] 2> / dev / null , чтобы отправить его в забвение, но, к сожалению, в> По какой-то причине запросы выводятся в STDERR (ошибка, IMO - они действительно должны идти в STDOUT), поэтому они также скрыты этим. Может быть возможно обработать некоторую работу с оболочкой, которая устранит предупреждение, не потребляя при этом также подсказок, но a) моя попытка этого ( в [время] 2> & 1 | grep -v warning ) не делает ' т и б) даже если вы можете найти комбинацию, которая работает, она не будет подходящей для псевдонимов (поскольку время идет в середине, а не в конце), поэтому вам придется либо вводить ее полностью каждый когда вы используете его или напишите скрипт-обертку вокруг в , чтобы справиться с этим.

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

3 голосов
/ 16 июня 2011

Это напоминает вам, что команды будут выполняться стандартной оболочкой Bourne, что означает, что ваш синтаксис команд должен быть совместим с этой оболочкой. («Забавный» факт: я только что заметил, что он предупреждает вас , хотя ваша текущая оболочка равна /bin/sh. Должно быть, ошибка.)

Чтобы легко удалить сообщение, просто удалите первую строку вывода. Это можно сделать удобным способом, переопределив команду at:

at() { /usr/bin/at $@ 2>&1 | tail -n +2; }

Вы можете добавить его в файл, содержащий другие псевдонимы вашей оболочки (~/.bashrc, ~/.zshrc или эквивалентный для вашей оболочки).

ПРИМЕЧАНИЕ. Команда tail в приведенном выше хаке также удаляет префикс at> при написании встроенных команд. Вероятно, не посредник, но что-то, о чем нужно знать.

2 голосов
/ 08 октября 2008

Если вы хотите обойти это сообщение, запустите скрипт at, который вызывает определенную среду, будь то ksh, bash, csh, zsh, perl и т. Д.

добавление - см. Справочную страницу «at» http://www.rt.com/man/at.1.html для получения дополнительной информации.

at and batch read commands from standard input or a specified  file which are to be executed at a later time, using /bin/sh.
0 голосов
/ 09 марта 2019

Исходный код at.c (из Debian версии 3.1.20-3) содержит ответ:

/ * POSIX.2 разрешает оболочку, указанную в пользовательской среде SHELL переменная, оболочка входа из базы данных паролей пользователя,
или / bin / sh - интерпретатор команд, обрабатывающий задание.
Это также позволяет печатать диагностическое предупреждение. Из-за
возможное отклонение, мы всегда выводим диагностику. * /

fprintf (stderr, "предупреждение: команды будут выполняться с использованием / bin / sh \ n");

Вы можете обойти это с помощью перенаправления оболочки:

% echo "echo blah"  | at now+30min 2>&1 | fgrep -v 'warning: commands will be executed using /bin/sh'
job 628 at Fri Mar  8 23:25:00 2019

Или вы даже создаете функцию для досуга (например, для интерактивной оболочки в ~/.zshrc или ~/.profile):

at() {
  /usr/bin/at "$@" 2>&1 | fgrep -v 'warning: commands will be executed using /bin/sh'
}

После этого он не будет предупреждать вас о данном конкретном предупреждении (в то время как другие предупреждения / сообщения об ошибках все равно будут доставляться вам)

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