コマンドラインの衛生状態が悪いです。有用なパイプラインが存在することを熱望するとき、それをどこかのシェル構成にコミットすることはめったにありません。むしろ、後で必要になったときに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コマンドを平手打ちし、 jq
てawk
フィルターを繰り返し実行し、追加されたパイプ間でコマンドを実行して、その間に何が得られるかを確認します。
わかった。開封キーと、開封する必要があるエンドポイントを取得しました。 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
を粉砕し、すばやく編集して先に進みます。それほど難しいことではありません。これをシェル関数のような非常に形式的なものにコミットすることが、オーバーヘッドに値しない理由がわかります。当時は具体的でしたが、今は適応させる必要があります。このコンテキストで使用することは、「私の歴史から取って微調整する」という言葉と非常によく一致します。¹
これを試して:
Ctrl-r
を改善します)。¹ チームの状況では、次のような例が少し崩れることを認めます。 S3 トラフィックを 1 秒で処理することはできますが、その知識と能力を他のユーザーに分散するにはどうすればよいでしょうか?ドキュメントとスクリプトの大規模なリポジトリでこれを解決できますが、この投稿の目的は、低摩擦コストと低参入障壁コストが歴史を輝かせるものであるという事実を強調することです.それとチーム共有を連携させる良い方法があるかもしれません。
² 「コマンド ラインによる最初の作業」に関する別の投稿がここに埋もれていますが、できる限り多くの作業をコマンド ライン形式に統合することで得られる大きなメリットがあることを強調するだけで十分です。シェル履歴の形でアクションを簡単に思い出せることは、相互運用性、再現性などの他の多くの利点と並んで 1 つの利点です。
ここにも掲載されています。