Назад | Перейти на главную страницу

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

Как можно выполнить сценарий оболочки без создания файла? Например, предположим, что у меня есть следующий сценарий (testscript):

#!/bin/bash
function run_free() {
   free -m
}

run_free

Тогда я, конечно, могу выполнить это с помощью: sh testscript

Однако я хочу избежать создания файла. Я попытался:

sh echo '#!/bin/bash function run_free() { free -m } run_free'

Что не сработало. Любые идеи?

У большинства интерпретаторов есть параметр для указания кода для выполнения. Вы можете использовать это для вызова определенного интерпретатора и предоставления кода. Например:

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-документа устраняет необходимость копировать (и поддерживать) один и тот же сценарий для нескольких учетных записей.

Йо, чувак, я слышал, ты любишь оболочку, поэтому я поместил оболочку в твою оболочку, чтобы можно было оболочку, пока ты оболочка.

Другими словами, вы создаете оболочку для своего echo команда, а затем просто повторить все в одной строке. Shell интерпретирует это как просто команду 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