Как выполнить сценарии оболочки без создания файлов
Как выполнить сценарий оболочки без создания файла? Например, предположим, у меня есть следующий скрипт (testscript
):
#!/bin/bash
function run_free() {
free -m
}
run_free
Я тогда, конечно, могу выполнить это с: sh testscript
Я хочу избежать создания файла, хотя. Я старался:
sh echo '#!/bin/bash
function run_free() {
free -m
}
run_free'
Который не работал. Есть идеи?
5 ответов
У большинства интерпретаторов есть параметр для указания кода для выполнения. Вы можете использовать это для вызова конкретного интерпретатора и предоставления кода. Например:
bash -c 'function run_free() { free -m; }; run_free'
(Обратите внимание, что вам нужно несколько точек с запятой, так как у вас нет перевода строки.)
perl
использования -e
, а также python
использования -c
,
Вы можете использовать здесь документы для подачи скриптов SSH:
ssh -T myhost <<EOF
hostname
whoami
uptime
EOF
Опция '-T' отключает распределение TTY.
Я использую эту технику для запуска стандартного сценария для нескольких учетных записей пользователей в одной из наших сторонних служб, которая не позволяет создать общедоступный доступный для записи каталог bin. Метод SSH here-document избавляет от необходимости копировать (и поддерживать) один и тот же сценарий для нескольких учетных записей.
Эй, черт возьми, я слышал, что вы любите раковину, поэтому я положил раковину в вашу раковину, чтобы можно было раковину, пока вы раковина.
Другими словами, вы создаете оболочку для своего echo
команда, а затем просто повторить все в одной строке. Оболочка интерпретирует это как просто команду эха. Даже если это не так, тот факт, что все в одной строке (особенно, что после новой строки нет #!/bin/bash
) вызывает проблемы.
При наборе этого ответа я узнал из вашего комментария, что вы собираетесь запускать команды через ssh. Тогда что-то вроде этого должно работать:
ssh your_user@yourserver "function run_free() { free -m } run_free"
Вы можете создать сценарии в исходной системе ssh и передать их в сеанс ssh
ssh user@somehost.tld /bin/bash <local.script
Поместите ваш пример в локальный скрипт run_free
ssh somehost.tld /bin/bash <run_free
Pseudo-terminal will not be allocated because stdin is not a terminal.
total used free shared buffers cached
Mem: 371 246 124 0 49 80
-/+ buffers/cache: 116 254
Swap: 767 0 767
запускает локальный скрипт на удаленном хосте.
Вы можете сделать то же самое с Perl
ssh user@somehost.tld /usr/bin/perl <perl.script
Если я правильно понял вопрос, вы были очень близки, ноsh echo '#!/bin/bash
входная строка вначале была ненужной.
Я пробовал ваш код в Ubuntu 20.04, версия bash 5.0.17. Все, что я сделал, это просто начал печатать функцию в терминале:
Ответ @mgorven в порядке, но не допускает многострочного кода, что может быть достаточно неудобно, если строки кода длинные.