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