Это должно работать приятно даже на сложные споры с пробелом и хуже:
#!/bin/bash
new_args=()
for arg
do
new_args+=( '-p' )
new_args+=( "$arg" )
done
for arg in "${new_args[@]}"
do
echo "$arg"
done
Тест:
$ ~/test.sh foo $'bar\n\tbaz bay'
-p
foo
-p
bar
baz bay
xsel
- управляйте X выборами.
xsel --clipboard --input
чтения stdin в буфер обмена
xsel --clipboard --output
запишите содержание буфера обмена к stdout
Вот отрывок оболочки (непротестированный), который должен сделать что-то близко к тому, что Вы хотите, от того, что я понимаю Вашего вопроса.
set -e
# Collect the output of the script in a variable
script_output=$(my_script)
# Check that the script output is nice and copypastable
awk '
/[^[:print:]]/ { print NR ": non-printable character"; exit 1 }
/ $/ { print NR ": trailing whitespace"; exit 1 }
/.{79}/ { print NR ": line too long"; exit 1 }
' <<EOF
$script_output
EOF
# Use expect to spawn a shell, feed it the script output, and
# check the result against expectations
export script_output
expect <<'EOF'
spawn sh
send "[array get env script_output]\n"
expect "the proper result"
EOF
Как я понял, необходимо повторно выполнить команды в точно той же последовательности, которую Вы уже сделали с начала сессии.Правильно?
Так может быть history
команда полезна здесь. На самом деле это зависит от Вашего HISTFORMAT
, но если это имеет значение по умолчанию, можно использовать некоторую команду флага как echo SOME_FLAG
и использование:
history | sed -n 'H;/SOM_FLAG/{/history/!{x;d}};${x;s/\n\s\+[0-9]*\s\+/\n/g;p}'
это извлечет последние команды начиная с SOME_FLAG. Как делает sed
работайте здесь:
H
просто копии текущий шаблон для содержания буфера
/SOME_FLAG/
часы, если строка соответствует к SOME_FLAG
если это делает это, также проверяет, не делает ли это соответствий к history
(это также зависит от Ваших жал оболочки, иногда управляйте уже, находится в истории сразу после выполнения, и histry будет видеть свою запись в нем),
если это соответствует ему, удаляют все предыдущие записи. и у нас есть все команды после последнего флага SOME_FLAG.
После этого можно отправить его для окружения через канал, например:
history | sed -n 'H;/man/{/history/!{x;d}};${x;s/\n\s\+[0-9]*\s\+/\n/g;p}' | bash -x
К сожалению, это - довольно опасный метод: в случае, если Вы используете некоторые команды с удалением, или с изменением важных данных оно может уничтожить что-то. Однако метод с автоматическим copy&paste с моделированием мыши может сделать подобные убытки. Поэтому просто будьте тщательным использованием этого.
И это также должно установить флаг каждый раз, когда Вам нужна эта функция.