開発者向けのコマンドラインツール
公開: 2022-03-11今日のオンラインの世界では、ユーザーを引き付けるための戦いが激しさを増しており、アプリメーカーはモバイルアプリまたはウェブアプリのいずれかを好みます。 デスクトップアプリケーションの関連性はますます低くなっています。 さらに、それらはWebアプリのリッチクライアントにすぎない傾向があります。Electronは人気のあるプラットフォームです。
これは、デスクトップをプラットフォームとして間もなく放棄することを意味しますか? いいえ、もちろんそうではありません、私はそれを言いません。 その上、GUIアプリは最近行き詰まっているように見えますが、成長し続けているデスクトップアプリのセグメントがあります。
ハッカーをフィーチャーした映画を見たことがありますか? 多くの場合、これらの人々は、ある種の端末を表示しているモニターの前で作業しているように見えます(通常は背景が暗く、前景が明るい)。 次に、この端末は、見ている人にとって明らかに何らかの意味を持つ通過するキャラクターで溢れる傾向があります。
このような実際のハッカーの表現は、プロの開発者によって嘲笑されることが多く、楽しみのために、さまざまな「ハッカー」効果をシミュレートするプログラムもあります。
ただし、現実の世界では、コマンドラインツールは娯楽的価値のために使用されていません。
まだコマンドラインインターフェイスツールを使用している理由
この記事では、コマンドラインインターフェイス(CLI)ツールを使用する実際的な側面に焦点を当てています。 CLIコマンドを理解し、高品質のツールを使用すると、生産性が向上し、GUIアプリよりもテキストインターフェイスの方がはるかに実用的な自動化へのさまざまなアプローチへの扉を開くことができます。
複数のクリックが1つの長いクリックとして聞こえるまで、GUIで繰り返しタスクを実行するのが上手になります。 問題は、これでも特殊なスクリプトの効率に勝るものはないということです。 さらに、同じ操作を手動で実行すると、認知的負荷が増加し、人的エラーの可能性が高まります。 いつものように、私たちは人間が退屈、反復的、または圧倒的に感じるかもしれないタスクを処理するためにコンピューターに依存しています。
端末ツールはいくつかのタイプのインターフェースを提供できることを知っておく価値があります。 lsのような非対話型のものがあります。これは単にパラメーターを受け取り、出力を提供します。 パッケージマネージャーで最も頻繁に見られる対話型または半対話型のインターフェイスがあります。 (「未確認のソースからインストールを続行してもよろしいですか?」)次に、端末の制限に適合するように設計されたインタラクティブなGUIアプリであるテキストユーザーインターフェイス(TUI)があります。 おそらく最も有名なのは、非常に人気のある(90年代の)ノートンコマンダーのクローンであるミッドナイトコマンダー(mc)です。
重要なコマンドラインツール
コンソールの住人になりたい場合は、最小限のコマンドライン開発者ツールを身に付ける必要があります。 間違いなくなくてはならないのは、インタラクティブなシェル(便利なタブ補完機能を備えたモダンなものを目指す)とテキストエディタです。
ここで、 UNIX哲学について説明します。これは、意識的かどうかに関係なく、ツールの作成者が設計を決定する際の基礎となることがよくあります。 重要なポイントのいくつかは、次のように要約できます。
- すべてをファイルとして扱います。
- 1つだけ実行しますが、うまく実行します。
- 標準入力から読み取り、標準出力に書き込み、エラーを標準エラーストリームに伝達します。
- 成功すると、戻りコード0になります。ゼロ以外の値はエラーを意味します(正確な戻りコードで指定できます)。
- コマンドの連鎖とスクリプトを許可します。
シェル
ターミナルを開いたときに最初に表示されるのはシェルです。 これは、ユーザーとマシンの間の対話を可能にする部分です。 コマンドを解釈し、プログラム名と引数に分割して、コマンドでスローしたすべてのシェルコマンドを実行します。
歴史的に、多くの異なる種類のシェルがありました。 最も人気のあるものの中には、 csh (C Shell)とBourne Shell(通常は単にshとして知られている)のさまざまな実装がありました。 BourneShellはKornShellに拡張され、Korn Shellもある程度の牽引力を獲得し、現在もその愛好家によって使用されています。 現在、Cshは一部のBSDシステムのデフォルトのシェルですが、他のほとんどすべてのUNIXライクなオペレーティングシステムは、ある種のBourneシェルを好みます。 Linuxディストリビューションはbashを好む傾向がありますが、MacOSXにはデフォルトの選択肢としてzshが付属しています。
他にも可能性はありますが、Windowsシステム上のMicrosoft PowerShellを除いて、あまり人気がありません。 PowerShellは、一部はzshなどのインタラクティブなUNIXシェルに、一部は.NETランタイムに触発されています。 UNIXの世界で一般的な概念であるテキストとしてすべてを扱う代わりに、オブジェクト指向のデータ操作が可能になります。
Microsoft PowerShellはWindowsの分野で非常に人気がありますが、UNIXを起源とする多くのプログラム(最も注目すべきはGit、Autotools、またはMake)は、BourneShellのバリエーションを好む傾向があります。 このため、msys(Git for Windowsにバンドルされている)、Cygwin、またはMicrosoftの最近のWSLなどのプロジェクトが生まれました。 WindowsでLinuxのような感覚が必要な場合は、ここでMSysが最適です。 標準のLinuxバイナリを実行できるフル機能のLinux環境が必要な場合は、WSLが最適です。 UNIX APIですが、Windows実行可能ファイルとしてコンパイルされています(これが必要な理由が実際にわかっている場合にのみ使用してください)。Cygwinがその答えです。
編集者
シェルに慣れたら、いくつかの便利なスキルを習得したいと思うでしょう。 コーディング作業のほとんどはテキストの記述(コード、README、コミットメッセージ)を中心に行われるため、インタラクティブなテキストエディターに関する十分な知識が不可欠です。 選択できるものはたくさんあります。エディターは開発者にとって最も必要なツールの1つであるため、どのエディターが最適かについては、おそらく同じくらい多くの意見があります。
最も人気のあるテキストエディタは、単純なテキストエディタとプログラム可能なテキストエディタの2つの基本的なグループに分けることができます。
どちらもコードの記述には最適ですが、名前が示すように、プログラム可能なものは、ニーズに完全に合うようにエディターを形成およびカスタマイズする機能を提供します。 ただし、学習曲線が急になる傾向があり、セットアップに時間がかかる可能性があるため、これには代償が伴います。
基本的なテキストエディタ
シンプルなテキストエディタの中で、GNUNanoが最も普及しています。 実際には、これはpicoエディターのクローンであるため、一方がシステムで使用できない場合は、もう一方を試すことができます。 もう1つの、より現代的な、両方の代替手段は、マイクロエディターです。 シンプルで拡張可能なものが同時に必要な場合は、ここから始めるのがよいでしょう。
プログラム可能なテキストエディタ
多くの開発者は、VimやGNUEmacsなどのさまざまな陣営のプログラム可能なエディターに依存しています。 どちらのエディターもコンソールまたはGUIモードで実行でき、どちらも他のソフトウェアにあるキーバインディングに影響を与えました。 どちらもAPIだけでなく、実際のプログラミング言語も組み込まれています。 EmacsはLISPに焦点を当てており、Vimは独自のVimLを使用していますが、他の一般的なスクリプト言語(Lua、Perl、Python、Rubyなど)へのインターフェイスも提供しています。 Neovimと呼ばれるVimへのより最近のアプローチも、深刻な支持を得始めているため、言及する価値があります。
やや紛らわしいかもしれませんが、Vimの前身であるviというエディターもあります(ちなみに、これは「 Vi i mproved 」の略です)。 Vimよりもはるかに簡単ですが、Vimで書くのに十分な自信がある場合は、viを使用する必要があることに気付いたとしても難しいことではありません。
pico /GNUNanoとvi/Vimは通常、さまざまなシステムにプリインストールされているため、少なくともそれらの基本を理解することをお勧めします(Vimを終了することは初心者にとって悪名高い難しい問題です)。 このように、リモートマシンで何かを編集する必要がある場合は、どのエディターが既に存在するかに関係なく、準備が整います。 プライベートデバイスでは、最も快適なエディタを自由に使用してください。
デフォルトのシステムエディタ
最後に注意すべきことは、システムにデフォルトエディタと呼ばれるものがある場合があるということです。
$EDITOR
環境変数はデフォルトのエディターを指し、Bourne互換シェル(sh、bash、ksh、zsh)では、 echo $EDITOR
と入力すると表示されます。 値が個人の選択と異なる場合は、 export EDITOR=my-awesome-editor
をシェルのランタイム構成( ~/.profile
、 ~./bashrc
、 ~/.zshrc
など)に追加して、自分で設定できます。
バージョン管理システムやメールクライアントなどの他のプログラムは、より長いテキスト入力が必要な場合にこのエディタを使用します。
マルチプレクサ
CLIで本格的な作業を開始するとすぐに、常に1つのアプリケーションしか開いたままにできないという制限に直面します。 コーディングするときは、コードを編集して実行し、間違いを修正してから、もう一度実行することをお勧めします。 バグを探すときは、ログを一覧表示して、サーバーにリクエストを送信したときに何がログに記録されるかを確認することをお勧めします。 通常、これは2つのアプリケーションを絶えず切り替えるか、いくつかのターミナルウィンドウを開くことを意味します。
これは、ターミナルマルチプレクサが役立つ場合があります。 マルチプレクサについて話すとき、一部の人々はすぐにトピックがGNUScreenであると思い込みます。 これは、この種の最初の普及したツールであり、今日でも非常に人気があります(多くの場合、デフォルトでインストールされます)。 その最新の代替品はtmuxであり、これは当然のことながら「 terminal multiplexer 」の略です。

これら2つを使用すると、特定のターミナルセッションで複数のウィンドウを開いて、それらのセッションを自由に切り替えることができます。 ウィンドウをペインに分割できるため、複数のアプリケーションを同時に実行し、(ウィンドウを切り替えることなく)リアルタイムで出力を監視できます。 また、これらはクライアントサーバーモードで動作します。つまり、いつでも切り離して後で戻って、中断したところから作業を続行できます。 この最後の機能は、人々が永続的なIRCセッションを望んでいたときにScreenの人気につながりました。
ほとんどのユースケースでは、GNU Screenまたはtmuxが最適ですが、何らかの理由でリソースが多すぎると思われる場合は、より軽い代替手段もあります。 dtach/atachとabducoがあります。 それらは意図的に範囲が限定されていますが、それぞれの任務をうまく遂行することができます。
パッケージマネージャー
この時点で、前述のすべてのソフトウェアをマシンにインストールすることを検討し始めることができます。 1つの問題は、ツールごとにインストール手順が異なることです。 ソースをダウンロードして自分でコンパイルする必要がある場合もあれば、自己完結型のバイナリを取得する場合もあります。また、バイナリパッケージと呼ばれるものを取得する場合もあります。これは通常、メタデータと一緒に圧縮された実行可能ファイルを意味します。
ソフトウェアのインストールプロセスを容易にするために、オペレーティングシステムの作成者はパッケージマネージャーの概念を採用しました。 簡単に言えば、パッケージマネージャーはCLIおよびデスクトップアプリのアプリストアのようなものです。 それは実際のアプリストアに数十年先行しています。 問題は、ほとんどすべてのシステムに独自のパッケージマネージャーがあることです。 Debian、Ubuntu、および派生したGNU / LinuxディストリビューションはAPTを使用し、Red HatベースのディストリビューションはyumまたはDNFを好みます。他のLinuxディストリビューションには、ソフトウェアをインストールするためのよりエキゾチックな手段があり、さまざまなBSDクローンも同様です。 組み込みのパッケージマネージャーの他に、MSWindows用のChocolateyやMacOS X/macOS用のHomebrewなどのユーザーインストールマネージャーもあります。 プログラムのインストール方法についての説明を書きたい場合は、それらのシステムごとにケースを作成することになります。 ちょっと多すぎるようですね。
幸い、前述のシステムの最後であるHomebrewは、HomebrewからGNU / Linuxシステムへの移植版であるLinuxbrewのおかげで、最も移植性の高いシステムになる可能性があります。 面白いことに、Microsoft Windowsで同様のユーザーエクスペリエンスを実現したい場合は、WSLでも機能します。 ただし、WSLは公式にはサポートされていないことに注意してください。
では、移植性以外に、Homebrewは他に何を提供できるでしょうか? まず第一に、それはシステムパッケージに干渉しないので、インストールするものはすべてオペレーティングシステムとは別のレイヤーにあります。 さらに、通常、パッケージをインストールするためにroot権限は必要ありません。 したがって、システムの安定性を犠牲にすることなく、安定してテストされたシステムパッケージを作成すると同時に、新しいバージョンをチェックすることができます。
エディターをテストしたい場合は、HomebrewまたはLinuxbrewを使用するシステムで実行する必要があるのは、次のコマンドを実行することだけです。
brew install emacs micro nano vim neovim
。
シャイニースタッフ
すでに説明したことは、間違いなく仕事に役立ちます。 しかし、必須ではありませんが、それでも日常生活に快適さをもたらすアプリケーションもあります。 あなたはそれらを必要としないかもしれませんが、それらを知ることは常に価値があります。
インタラクティブフィルター
コマンド履歴の検索は面倒な場合があります。 bashとzshはどちらもCtrl+Rキーバインドを備えていますが、一度に1つの置換しか表示されません。 さらに、以前に使用した正確なテキストを入力する必要があります。 これは非常に一般的な操作であるため、コマンドラインを使い始めると、改善の余地があるように見えます。
fzy、percol、peco、fzfなどのインタラクティブなフィルターは、長いテキスト行のフィルター処理に役立ちます。 これは、前述のコマンド履歴、プロジェクトディレクトリ内のすべてのコード行、またはfind .
。 ここでの一般的な考え方は、最初に利用可能なすべての行を提示し、次にファジー検索アルゴリズムに依存して、一致しないすべてのものを除外することです。
たとえば、Ctrl + Rをfzfにバインドすると、最新のコマンドのリストが表示され、矢印を使用して上下に移動できます。または、 git
と入力して、内部のどこかにGitを備えたコマンドのみを表示できます。 個人的には、インタラクティブフィルターのないシェルで作業していると、突然少し迷ってしまいます。 この機能は本当に魅力的です!
さらに、プログラム可能なテキストエディタ内でインタラクティブフィルタを利用できるようにすることができます。 このようにして、シェルとエディターの間で統一された検索機能を利用できるようになります。
インタラクティブナビゲーター
Facebook PathPickerは、私が主にC++プロジェクトで作業していたときに非常に役立ちました。 コンパイラーによって生成されたエラーログはかなり大きくてかなり厄介になる可能性があり、そのログ内の実際のパスを見つける機能は生産性の向上につながりました。
任意のテキストファイル、またはtmuxで使用した場合の画面のコンテンツで、fppはファイルパス以外のすべてをフィルタリングします。 次に、これらのパスの1つ以上を選択し、それらを使用してコマンドを実行できるUIが表示されます。 最も一般的な応答は、もちろん、デフォルトのアクションであるエディターでファイルを開くことです。
Git UI
あなたが取り組んでいるプロジェクトの少なくとも1つは、バージョン管理システムとしてGitを使用している可能性があります。 完全に強力ですが、GitCLIは優れたユーザーエクスペリエンスの頂点ではありません。 Gitヘルプ$SUBCOMMAND
のすべてのオプションを読んでストレスを軽減するために、tigをチェックすることをお勧めします。 log
やblame
など、その恩恵を受ける操作のための優れたコンソールUIを提供します。
GItユーザーを支援することを目的としたもう1つのツールは、 FixAllConflictsの頭字語であるfacです。 ご想像のとおり、マージやリベースを行っているときに競合が発生した場合に便利です。 これは、vimdiffなどの他のマージツールの代替手段です。
ファイル管理
90年代には、誰もが2ペインのファイルマネージャーを望んでいた時期がありました。 トレンドはノートンコマンダーから始まりました。 他の多くの人も同じ道をたどりましたが、安定したユーザーベースがまだ見られるのはMidnightCommanderです。 最も明白な使用例は、mcを使用してローカルファイルを操作することですが、リモートマシンで作業する場合にも非常に役立ちます。
ほとんどのコマンドラインプログラムと同様に、非常に軽量であるため、sshでの実行に問題はありません。また、FTPおよびFISHプロトコルをサポートしているため、ローカルファイルシステムを一方のペインに表示し、リモートファイルシステムをもう一方のペインに表示できます。便利です。 scpへの引数としてファイル名を入力またはコピーすることを避けたい場合の機能。
楽しみのためだけのCLIツール
「すべての仕事と遊びがないので、ジャックは退屈な少年になります」と彼らは言います。 あなたの娯楽にのみ役立つプログラム、コマンドラインなどがたくさんあります。 ローグビデオゲームはこのカテゴリに分類されます。 それはゲームの全ジャンルに名前を付けさえしました! 他の人気のあるおもちゃはフォーチュンとカウセイです。たとえば、CIスクリプトのどこかでそれらを使用すると、1日が少し鈍くなる可能性があります。
しかし、私たちの中には、そもそもコンソールを使用することの主な魅力は、映画のハッカーのように感じることです。 No MoreSecretsとHollywoodHackerは、このグループをよく表しています。 誰かがあなたの仕事を見ているときに試してみてください。あなたのハッカーの信用は確実に高まります。
実際のコマンドライン
では、シェル、エディター、およびさまざまなアプリのすべてのスイッチの使用方法を学習するために費やした時間を相殺するコマンドラインの魅力は何でしょうか。 簡単な答えは生産性です。これは2つのことから生まれます。
1つは、ターミナルウィンドウだけが表示され、それ以上何も表示されない場合、気を散らすものがあまりないため、より集中的に集中できることです。 通知がポップアップしたり、広告が表示されたり、かわいい子猫の写真が表示されたりすることはありません。 あなたとあなたの目標だけ。
2つ目は自動化です。 頻繁に組み合わされるいくつかのアクションをスクリプトに入れて、毎回すべてを手動で入力する代わりに、後で全体として呼び出すことができます。 シェルの履歴を検索することで、かつて作成した特に複雑なコマンドにすばやく戻ることができます。 基本的に、あなたは何でも記録して再生することができます、そしてコードはあなたがしたことのドキュメンテーションとして利用可能です。
エイリアスを追加する機能も、利益に貢献します。 たとえば、Gitでコミットを作成する場合、同じコミットを(今のところ)完全になるまで更新することがよくあります。 目的のファイルをステージングしたら、 git carmh
を実行します。 マニュアルで調べようとしないでください。これは、 commit --amend --reuse-message=HEAD
意味する私のプライベートエイリアスです。 それは確かにいくつかのタイピングを節約します。
つまり、人々は同じ行動を何度も繰り返すことに飽きてしまい、退屈は集中力を低下させます。 これは間違いやエラーにつながる可能性があります。 それらを回避する唯一の方法は、ハイフォーカスとローフォーカスのアクションを組み合わせないことです。 コードの記述は焦点が絞られており、コミットメッセージとコンテンツのレビューは焦点が絞られていますが、コミットレビューの段階に到達するために、あちこちで機械的なクリックを数回繰り返す必要がある場合、焦点が低くなる可能性があります。 もちろん、コマンドラインにはそのような機械的なアクティビティがないわけではありませんが、自動化のおかげで、それらのほとんどを回避できます。
さらなる調査
この記事で説明されているコマンドラインツールの一部またはすべてをすでに知っているかもしれません。 あなたはそれを読んでいる間に何か新しくて役に立つことを学んだかもしれません。 もしそうなら、すばらしい—ここでの私の目的は、さまざまなツールの包括的な概要と比較を提供することではなく、日常業務で役立つと思われるいくつかの重要なツールを示すことでした。それも。
そこにははるかに興味深いコマンドラインプログラムがあります。それらに興味がある場合は、今日利用できる最高のコマンドラインツールのいくつかのAwesomeShellキュレートリストを確認することをお勧めします。
ほとんどのGUIアプリには、対応する端末があります。 これには、Webブラウザー、電子メールクライアント、チャットクライアント(IRC、Slack、XMPP)、PIMスイート、またはスプレッドシートが含まれます。 私が言及していない良いプログラムを知っているなら、コメントでそれらを持ち出してください。