Расширение фигурной скобки может быть выполнено в 'при' команде?

Question1

Question2

1
24.03.2015, 00:47
2 ответа

Есть еще три простых варианта. Один немного хрупок и основан на деталях реализации оболочек, другой использует здесь документы для предоставления сценария bash встроенным, а другой просто использует -c ] для передачи одной строки.


Наиболее надежно и переносимо используйте здесь документ :

$ at now
warning: commands will be executed using /bin/sh
at> bash <<'EOF'
at> echo {1..5} >/tmp/output
at> EOF
at> <EOT>
job 24 at Mon Mar 23 20:41:20 2015
$ cat /tmp/output
1 2 3 4 5

<< word объявляет здесь документ, который предоставляется в качестве стандартного ввода для bash и длится до word . Цитируя 'EOF' , документ не подлежит расширению оболочкой, поэтому вы можете написать $ в теле, не поглощая его тире . Ваш сценарий может включать в себя что угодно, кроме EOF (или вашего слова по выбору) в начале строки.

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


Если это действительно всего одна строка, просто используйте bash -c , чтобы передать одну команду для запуска:

$ at now
warning: commands will be executed using /bin/sh
at> bash -c 'echo {1..3} >/tmp/output'
at> <EOT>
job 25 at Mon Mar 23 20:50:03 2015
$ cat /tmp/output
1 2 3

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


Самое хакерское: atd обычно отправляет задания в оболочку как стандартный ввод (но я не думаю, что это требуется). Оболочки обычно считывают стандартный ввод построчно (но они не обязаны вести себя подобным образом).

Если ваши реализации действительно ведут себя подобным образом, вы можете выполнить неприятный трюк, чтобы запустить свое задание в другой оболочке:

$ at now
warning: commands will be executed using /bin/sh
at> bash
at> echo {1..10} >/tmp/output
at> <EOT>
job 22 at Mon Mar 23 20:40:00 2015
$ cat /tmp/output
1 2 3 4 5 6 7 8 9 10

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

dash сам по себе заметно более сложен в этой области, чем многие оболочки, и для него важнее заполнение внутреннего буфера. Другие упрощенные оболочки, такие как BusyBox sh , имеют тенденцию к буферизации строк.


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

Я действительно не могу рекомендовать использование последней опции с помощью стандартного ввода, но это забавный трюк.

3
27.01.2020, 23:27

Единственное решение, которое я нашел до сих пор, - это написать сценарий (давайте назовем его ExcessMe.sh), который указывает использование Bash , как интерпретатор.

#!/bin/bash
echo {1..10} >output

Затем запустите скрипт из в Подскажите:

$ at - now
warning: commands will be executed using /bin/sh
at> expandme.sh
at> <EOT>

Теперь скрипт вы получит нас из / Bourne изгнание, что при поставке США и выполняют расширение перед сбросом вывода.

0
27.01.2020, 23:27

Теги

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