Вывод на 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
}
Другие вопросы по тегам