Как выполнить сценарии оболочки без создания файлов

Как выполнить сценарий оболочки без создания файла? Например, предположим, у меня есть следующий скрипт (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 в порядке, но не допускает многострочного кода, что может быть достаточно неудобно, если строки кода длинные.

Другие вопросы по тегам