Можно ли скопировать расширение в команде `at`?

В bash расширение скобки выполняется как операция оболочки перед выполнением команды. 1 Это означает, что следующее будет работать:
echo {1..10} >output | at -m now

Выход будет 1 2 3 4 5 6 7 8 9 10 .

То, что не работает, – попытка выполнить расширение скобки внутри команды, которая предупреждает, что команды будут выполняться /bin/sh , что в моем случае связано с dash которая, похоже, не поддерживает расширение диапазона с помощью фигурных скобок.

 $ at - now warning: commands will be executed using /bin/sh at> echo {1..10} >output at> <EOT> 

Это запустит команду в dash (или Bourne или в какой-либо другой оболочке, к которой вы привязаны /bin/sh ), что приводит к результату {1..10} .

Как может быть выполнено расширение при использовании команды at таким образом?


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

2 Solutions collect form web for “Можно ли скопировать расширение в команде `at`?”

Есть три простых варианта. Один из них немного хрупкий и опирается на детали реализации оболочек, другой использует здесь документы, чтобы предоставить скрипту bash inline, а другой просто использует -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' документ не подлежит расширению оболочкой, поэтому вы можете написать $ в теле без dash едящего его. В начале строки ваш скрипт может включать в себя что-либо, кроме 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 затем считывает остальную часть стандартного ввода в качестве своих команд. Это довольно хрупко, но это наименее интрузивная версия, когда она работает.

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


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

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

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

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

Затем запустите сценарий из приглашения:

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

Теперь скрипт вытащит нас из ссылки в dash / Bourne чтобы мы ввели нас и выполнили расширение до сброса вывода.

  • Что делает `date 2 &> $ 0` do?
  • bash: вставлять текст в переменную без необходимости пропускать символы
  • Bash clear command weird behavior удаляет буфер прокрутки.
  • Не удалось создать указанные оконные стекла
  • bash: Синтаксис около неожиданной ошибки '('
  • Bash: Итерирование 2 списков с использованием одиночного цикла In In
  • Ошибка перехвата «команда не найдена» в zsh
  • Замена места для команды paste
  • Как повторно использовать последний вывод из командной строки?
  • В чем разница между echo `date`, echo" date "и echo '' date`?
  • Как заменить «базовую системную оболочку» на IPython?
  • Interesting Posts

    Как остановить команду find после первого совпадения?

    Использование цикла for для петли над несколькими массивами в bash

    что означает «gbp: error: upstream / 1.5.13 не является допустимым деревом»?

    Отображение сообщений в tty с использованием whiptail через monit

    Итерируйте файл до тех пор, пока не будет извлечено каждое значение выше порогового значения

    Base64 декодирует и перезаписывает файл

    Передача набора параметров программе с использованием переменной Bash

    переопределять жестко заданные пути в исполняемых файлах

    Отключение срока действия пароля для автоматического входа в систему Пользователь Linux

    Как проверить число, меньшее другого числа

    Ограничение размера блока mkreiserfs, кроме как на странице man / info?

    Как восстановить xkilled панель в Linux Mint без перезагрузки?

    Почему на ноутбуках на базе Linux есть слабый сигнал Wi-Fi по сравнению с ноутбуком на базе Windows?

    Выбрав дистрибутив для старого ПК, какую проблему совместимости нужно искать?

    Почему команда grep игнорирует период в строке поиска?

    Linux и Unix - лучшая ОС в мире.