私はシェルコマンドを出力するシェルスクリプトを持っています。マウスでコピーして貼り付けるある端末ウィンドウから別のウィンドウへ(同じウィンドウでテストできます)。出力しなければならない純粋な空白以外の重要な空白文字を含まず、出力行しなければならないソフトニューラインをハードニューラインにコピーする端末でも、コードが正しくコピーされるように切り捨てられます。確かにしたい。私は次のことを考えています:
$ 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
クリップボードで標準入力を読む
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
残念ながら、これは非常に危険なアプローチです。特定のコマンドを使用して機密データを削除または変更すると、何かが破損する可能性があります。ただし、自動コピーと貼り付け方法をシミュレートするためにマウスを使用すると、同様の損傷が発生する可能性があります。だからこれを使うときは注意してください。
また、この機能が必要なときはいつでもフラグを設定する必要があります。