Как мне отредактировать вывод скрипта bash перед его выполнением? - PullRequest
1 голос
/ 17 февраля 2010

Например, посмотрите на следующую строку bash-кода

eval `echo "ls *.jpg"`

В нем перечислены все jpgs в текущем каталоге. Теперь я хочу, чтобы он просто печатал строку в приглашении, чтобы я мог ее отредактировать перед выполнением. (Как, например, key-up)

Как мне это сделать?


Причиной этого вопроса является гораздо более полезный псевдоним:

alias ac="history 2 | sed -n '1 s/[ 0-9]*//p' >> ~/.commands; sort -fu ~/.commands > ~/.commandsTmp; mv ~/.commandsTmp ~/.commands"
alias sc='oldIFS=$IFS; IFS=$'\n'; text=(); while read line ; do text=( ${text[@]-} "${line}") ; done < ~/.commands; PS3="Choose command by number: " ; eval `select selection in ${text[@]}; do echo "$selection"; break; done`; IFS=$oldIFS'
alias rc='awk '"'"'{print NR,$0}'"'"' ~/.commands; read -p "Remove number: " number; sed "${number} d" ~/.commands > ~/.commandsTmp; mv ~/.commandsTmp ~/.commands'

Где ac добавляет или запоминает последнюю введенную команду, sc показывает доступные команды и выполняет их, а rc удаляет или забывает команду. (Вам нужно touch ~/.commands, прежде чем он заработает)

Было бы еще полезнее, если бы я мог отредактировать вывод sc перед его выполнением.

Ответы [ 4 ]

0 голосов
/ 17 февраля 2010

Может быть, вы могли бы использовать preexec.bash?

http://www.twistedmatrix.com/users/glyph/preexec.bash.txt

(В связанной заметке вы также можете редактировать текущую командную строку, используя ctrl-x-e!)

ура

tavod

0 голосов
/ 17 февраля 2010

Некоторые комментарии к вашим псевдонимам:

Упрощенное цитирование:

alias rc='awk "{print NR,\$0}" ~/.commands ...'

Нет необходимости в tail, и вы можете объединить вызовы на sed:

alias ac="history 2 | sed -n '1 s/[ 0-9]*//p'..."

Упрощенный eval и не нужно $IFS:

alias sc='text=(); while read line ; do text+=("${line}") ; done < ~/.commands; PS3="Choose command by number: " ; select selection in "${text[@]}"; do eval "$selection"; break; done'
0 голосов
/ 17 февраля 2010

@ OP, вы действительно должны поместить эти команды в подпрограммы, и когда вы хотите их использовать, поставьте их.(взято из ответов Денниса)

rc(){
 awk "{print NR,\$0}" ~/.commands ...
}

ac(){
 history 2 | sed -n '1 s/[ 0-9]*//p'...
}

sc(){
 text=()
 while read line
 do 
     text+=("${line}") 
 done < ~/.commands
 PS3="Choose command by number: " 
 select selection in "${text[@]}" 
 do 
     eval "$selection"
     break
 done
}

затем сохраните его как "library.sh" или как-то еще, и когда вы захотите его использовать

$ source /path/to/library.sh  

Или

$ . /path/to/library.sh  
0 голосов
/ 17 февраля 2010
history -s whatever you want

добавит "что хочешь" в историю bash. Затем простая стрелка вверх (или !!, сопровождаемая вводом, если вы включили историю, включена - я думаю, что это вариант, о котором я думаю, не уверен на 100%), даст вам «все, что вы хотите» в команде строка, готовая к редактированию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...