バッシュレコードをエコーし​​てリダイレクトしましょう!ファイルのコマンド

バッシュレコードをエコーし​​てリダイレクトしましょう!ファイルのコマンド

!コマンドで履歴コマンドをスクリプトファイルにエコーしてリダイレクトできますか?私は無視したpipe、またはコマンドに変更がありますかredirecttee

  518  xmodmap -e "keycode 66 = Return"
  519  xmodmap -e "keycode 23 = Tab"
  535  xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'

[Tech_Ministry@localhost ~]$ echo !535 && !518 >> xmodmap_-e.sh 
echo xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape' && xmodmap -e "keycode 66 = Return" >> xmodmap_-e.sh 
xmodmap -e clear Lock -e keycode 0x42 = Escape

この記事を読んだ後郵便はがき頑張ったecho !535:p && !518:p >> xmodmap_-e.sh

何か簡単なものが抜けたようですが…これは可能でしょうか?各コマンドを別々の行に表示できますか?

答え1

からhelp history

  -p    perform history expansion on each ARG and display the result
    without storing it in the history list

たとえば、私が主にすることは、history -p \!572 >> myfile履歴にコマンド572を保存することです。

あなたの例では、以下を使用します。

echo "$(history -p '!535') && $(history -p '!518')" >> xmodmap_-e.sh

history単一のコマンドを使用してこれを行う方法があります。

(これにより、スクリプトファイルの1行に2つのコマンドが&&演算子に関連付けられて配置されます。)


更新:この記事を書いて、私が探しているより簡単な形式は次のとおりです。

history -p \!535 \!518 >> whatever.sh

答え2

履歴マークを二重引用符で囲むと、拡張子を引用符付き文字列としてキャプチャできます。

echo "!535 && !518" >> xmodmap_-e.sh 

公開された試みが失敗した理由は、参照されず、アクションが取られた&&ためです。

echo !535 && !518 >> xmodmap_-e.sh

これは2つのコマンドに拡張されます。

echo {the expansion of !535}
&&
{run the expansion of !518} >> xmodmap_-e.sh

したがって、最初の拡張が作成されます。標準出力、対応するジョブがecho成功したため、2番目のジョブが実行され、その後のすべての出力がファイルに追加されますxmodmap_-e.sh

関連情報