paint-brush
コマンドラインの衛生状態が悪い?シェル履歴の負荷を考慮する@tylerjl
930 測定値
930 測定値

コマンドラインの衛生状態が悪い?シェル履歴の負荷を考慮する

Tyler6m2022/07/22
Read on Terminal Reader
Read this story w/o Javascript

長すぎる; 読むには

私たちの職業におけるコマンドまたはシェル履歴の概念は、非常に過小評価されているメカニズムです。職場での重要な質問に答える可能性のあるコマンドからいくつかの部分文字列を思い出すことができれば、あなたの専門的な経験のすべての歴史をすぐに知ることができます.ここでは、ソフトウェア エンジニアリングの重要な側面として、シェルの歴史をどのように使用しているかを説明します。

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - コマンドラインの衛生状態が悪い?シェル履歴の負荷を考慮する
Tyler HackerNoon profile picture

コマンドラインの衛生状態が悪いです。有用なパイプラインが存在することを熱望するとき、それをどこかのシェル構成にコミットすることはめったにありません。むしろ、後で必要になったときにfzfに浚渫してもらいます。私の関数は文書化されておらず、ゴルフをコーディングする傾向があるため、非常に短い名前と変数を使用しており、その時点でのユースケースに固有であり、一般的ではありません。


それ以来、これが最適なアプローチであると判断しました。

その発言を取り戻せ、逸脱者

いいえ!私は実際にこれを信じています。私には理由があります。


私たちの職業におけるコマンドまたはシェル履歴の概念は、非常に過小評価されているメカニズムです。


すべての履歴を保持し、端末コマンドの形式ですべての操作タスクを表現する場合、数秒以内に作業の全履歴 (コーディング アーティファクトを除く) を取得できる可能性があるという事実を考慮してください。 opensslで x509 証明書を作成するにはどうすればよいですか?ホスト群の中でSpectreをチェックする最も簡単な方法は何ですか?質問に答える可能性のあるコマンドからいくつかの部分文字列を思い出すことができれば、履歴検索により、この失われた記憶をすぐに再利用できるようにすることができます。


別の職業が、すぐに使用できるアクションに変換される、この種の瞬時に、無限に保持され、記録するのに労力がかからないリコールをどのように評価するかを想像してみてください。特定の種類の法的文書を提出する弁護士?一連のテストを採点する教師?もっと考えられるかもしれませんが、私が言いたいのは、ホワイト カラーのソフトウェア エンジニアリング作業の交差点にあるシェルの歴史の概念には、大きな可能性があるということです。


これは私自身の仕事から取られた実際の例です。ユースケースは異なるかもしれませんが、私が時々遭遇する状況の 1 つは、カーネルの更新などのためにダウンさせたホストの Vault インスタンスを開封することです。フィードバック ループは次のようになります。


  • ああ、この Vault インスタンスを開封しなければなりません。開封キーはどこにありましたか?

    • そうそう、それは Bitwarden にあります。私はrbwでそれをつかむことができます:

       rbw get 'Vault Unseal Key'
  • くだらない。どのインスタンスを開封する必要がありますか?

    • 私は領事に尋ねることができると思います:

       http :8500/v1/health/state/critical
    • おー。これらのノードを、他の何かで使用できるエンドポイントのリストとして取得できますか?

       http :8500/v1/health/state/critical \ | jq -r '.[].ServiceID' \ | awk -F: '{ print "http://" $2 ":" $3; }'

      : これはサブ例です。そのパイプラインを暗記していないためです。 httpie コマンドから始めて、 jqコマンドを平手打ちし、 jqawkフィルターを繰り返し実行し、追加されたパイプ間でコマンドを実行して、その間に何が得られるかを確認します。

  • わかった。開封キーと、開封する必要があるエンドポイントを取得しました。 zshループでそれらを接着できます。

     http :8500/v1/health/state/critical \ | jq -r '.[].ServiceID' \ | awk -F: '{ print "http://" $2 ":" $3; }' \ | while read -rh do VAULT_HOST=$h vault operator unseal $(rbw get 'Vault Unseal Key') done

ここでの最後のコマンドは、無愛想でちょっと鈍いです。これをクリーンアップして、きちんとコード化されたシェル関数またはスクリプトに配置する方法を理解するのは難しいことではありません: Vault アンシール キーの変数、シールされたホストのリストを抽出する関数などです。


しかし、はこの種の短いスクリプトをよく行います。そして、「私が書く小さなパイプラインの量それらを適切なシェル スクリプトに変換し、適切なファイルに入れ、ドットファイル リポジトリにコミットするのにかかる時間」の数は、実際には些細なことではありません。だから私はそれをスキップします!


私はこれについて自分自身を判断していました。しかし、何年にもわたって、多くのパイプラインをスクリプトのどこかに記録していないことに対して自分自身を蹴った回数は、私のシェル履歴では非常に少ないか存在しません.


大きな後悔が 1 つあります。それは、ワークステーション間でそれらを持ち歩かなかったことです。しかし、シェルの履歴を持ち歩くのに役立つように特別に設計されたツールがあることをご存知ですか?それはもはや大きな問題ではありません!


では、大規模で時には複雑なアクションをシェル履歴にまとめて頻繁に実行し、 .shell_historyを美しく恐ろしい庭に成長させたらどうなるでしょうか?


非常に多くのことを行うことができ、a) これらのショートカットを記録することと、b) それらを使用することの両方のオーバーヘッドは、本質的に摩擦がありません。 fzfのような機能をすぐに利用できるため、コマンド ライン作業におけるプロとしてのキャリアの全履歴がすぐに利用できるようになります。後世のためにそれを記録するための障壁を克服する価値があると感じたものに制約されることはありません.すべてがそこにあり、それを文書化することを考える必要はありませんでした。


例として、私は長い間、低レベルの S3 メトリクスを直接扱っていません。しかし、過去に S3 バケットを介して合計トラフィックを集約する必要があったことを思い出します。 Ctrl-r aws s3 statistics <RET>入力すると、約 2 秒でその質問に答えるコマンドを見つけることができます。

 today="$(date +%s)" for bucket in $(aws s3 ls | awk '{ print $NF; }') do echo -n "$bucket " aws cloudwatch get-metric-statistics \ --namespace AWS/S3 \ --start-time "$(echo $today - 86400 | bc)" --end-time "$today" \ --period 86400 \ --statistics Average \ --region us-east-1 \ --metric-name BucketSizeBytes \ --dimensions Name=BucketName,Value=$bucket Name=StorageType,Value=StandardStorage \ | jq '.Datapoints[].Average' \ | gnumfmt --to=si done


これはおそらく、数年後に同様のタスクのために書かれたように 100% 使用することはできませんが、そのCtrl-x Ctrl-eを粉砕し、すばやく編集して先に進みます。それほど難しいことではありません。これをシェル関数のような非常に形式的なものにコミットすることが、オーバーヘッドに値しない理由がわかります。当時は具体的でしたが、今は適応させる必要があります。このコンテキストで使用することは、「私の歴史から取って微調整する」という言葉と非常によく一致します。¹

tl;dr

これを試して:


  • シェルの履歴設定を微調整して、多くの履歴を保持します。 atuinのようなものをセットアップして、どこにでも持ち運べるようにすることもできます (または、少なくともfzf の履歴統合を使用してCtrl-rを改善します)。
  • 可能な場合は、自己完結型のシェル コマンド内でタスクまたは作業単位を表現してみてください。² これは、より長く、よりまとまりのあるシェル コマンドを意味しますが、それでも問題ありません。あなたの目標は、それ以外の場合は手動で行う可能性のあるアクションを置き換えることができる小さなプログラムのライブラリを徐々に蓄積することです。
  • 難しいことや複雑なことを数回のキーストロークで実行できるコマンドを再利用できるとき、未来のあなたは現代のあなたに感謝するでしょう。

脚注

¹ チームの状況では、次のような例が少し崩れることを認めます。 S3 トラフィックを 1 秒で処理することはできますが、その知識と能力を他のユーザーに分散するにはどうすればよいでしょうか?ドキュメントとスクリプトの大規模なリポジトリでこれを解決できますが、この投稿の目的は、低摩擦コストと低参入障壁コストが歴史を輝かせるものであるという事実を強調することです.それとチーム共有を連携させる良い方法があるかもしれません。


² 「コマンド ラインによる最初の作業」に関する別の投稿がここに埋もれていますが、できる限り多くの作業をコマンド ライン形式に統合することで得られる大きなメリットがあることを強調するだけで十分です。シェル履歴の形でアクションを簡単に思い出せることは、相互運用性、再現性などの他の多くの利点と並んで 1 つの利点です。


ここにも掲載されています。