シェルコマンドを出力するシェルスクリプトがあります。マウスでコピー&ペーストターミナルウィンドウから別のターミナルウィンドウへ(同じウィンドウでテストすることはできます)。出力すべき空白文字以外の意味のある空白文字は含まれず、出力行にはすべきソフト改行がハード改行としてコピーされる端末でもコードが適切にコピーされるように切り捨てる必要があります。確認したいと思います。次のようなことを考えています:
$ eval `resize -s 24 80`
$ reset
$ my_script
$ mouse_copy *all of the terminal history except for the first line*
$ mouse_paste
$ assert *the paste created the proper result*
xclip
可能であれば、これを次のようにエミュレートすると良いでしょう。
スクリプトは、X のないカスタム Linux サーバー上で実行する必要があります。端末出力がクライアントに送信される詳細はわかりませんが、スクリプトはクライアント側の X サーバーに現在表示されている内容を問い合わせる必要があるのではないでしょうか。
答え1
xsel
- X 選択を操作します。
xsel --clipboard --input
stdin をクリップボードに読み込む
xsel --clipboard --output
クリップボードの内容を標準出力に書き込む
答え2
あなたの質問から私が理解している限りでは、あなたが望んでいることに近いことを実行するシェル スニペット (未テスト) を以下に示します。
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
答え3
私の理解では、セッションの開始以来実行したのとまったく同じ順序でコマンドを再実行する必要があります。そうですか?
したがって、ここでは コマンドが役に立つかもしれません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
(シェルの状態にも依存します。実行直後にコマンドがすでに履歴にある場合があり、履歴にそのエントリが表示されます)。
一致する場合は、以前のエントリをすべて削除します。これで、最後の SOME_FLAG フラグの後のすべてのコマンドが取得されます。
その後、パイプ経由でシェルに送信できます。例:
history | sed -n 'H;/man/{/history/!{x;d}};${x;s/\n\s\+[0-9]*\s\+/\n/g;p}' | bash -x
残念ながら、これはかなり危険な方法です。削除や重要なデータの変更を伴うコマンドを使用すると、何かが破壊される可能性があります。ただし、マウス シミュレーションによる自動コピー アンド ペーストの方法でも、同様の損害が発生する可能性があります。したがって、この方法を使用する際には注意してください。
また、この機能が必要になるたびにフラグを設定する必要があります。