Вывод на Python или Bash в командную строку готов к выполнению
Я пытаюсь написать скрипт Python или Bash, который выводит команду bash непосредственно в командную строку (то есть, как будто я только что набрал ее, а затем мог нажать Enter, чтобы выполнить ее).
Как я могу вывести команду таким образом?
4 ответа
Я не думаю, что это возможно в bash
, Однако разумное подмножество функциональных возможностей подсказки может быть смоделировано в bash
4 или позже, используя read
встроенный и сразу же выполняет ввод с eval
:
$ read -ei "ls -l"; eval "$REPLY"
Неявное продолжение строки недоступно, например, если вы заканчиваете строку |
; вам нужно будет явно указать символ продолжения строки, и на следующей строке также будет вставлен начальный текст, поэтому вам придется очистить строку перед продолжением.
С BASH вы можете легко сделать это с помощью встроенной команды select. Вот хороший пример для начала: http://linux.die.net/Bash-Beginners-Guide/sect_09_06.html
cmd=( ls -l "hello world" ) # given an array as input
printf '%q ' -v cmd_quoted "${cmd[@]}" # transform it to an eval-safe string
echo "Run the following: $cmd_quoted" # ...which can then be run by the user
Один из способов использования этого в Python - это передача содержимого в bash (вы также можете запустить соответствующий скрипт bash через subprocess.Popen()
):
#!/usr/bin/env python
import sys
cmd=['ls', '-l', 'hello world']
for element in cmd:
sys.stdout.write('%s\0' % element)
... и в bash, чтобы прочитать входные данные, разделенные NUL, и написать eval-safe команду:
#!/usr/bin/bash
arr=()
while IFS= read -r -d '' entry
arr+=( "$entry" )
done
printf '%q ' "${arr[@]}"
printf '\n'
... затем, чтобы связать их вместе:
./python-gen-cmd | ./bash-gen-cmd
... даст вам безопасную команду на стандартный вывод, готовый для копирования и вставки или отправки по SSH-соединению. Это работает, даже если ваши команды содержат непечатаемые символы или подобные странности.
vim-slime выполняет нечто подобное, пройдя через screen
или же tmux
, Вот подтверждение концепции Bash для работы под tmux
:
print_to_cmd_line() {
printf '%s' "$*" | tmux load-buffer -
tmux paste-buffer -d
}