#!/ Bin / shが先頭にあるssh / cd / vimというスクリプト
単純な方法で「ssh」、「cd」、「vim」と呼ばれるスクリプトを作成しようとすると、無限再帰のためにvimまたはsshを実際に実行できません。
#!/bin/sh # ssh, cd vim $PATH , # /bin, /usr/bin, vim ssh # , ($1) ([ -d ... ] , . man test ) if [ -d "$1" ]; then cd "$1" # , (-f), vim elif [ -f "$1" ]; then vim "$1" # , hostname , , hostname, else ssh "$1" fi
このアプローチはvimおよびsshコマンドに対して機能します。スクリプトに別の名前を付けて、自分自身に連絡しないようにしたり、vimおよびsshへのフルパスを記述したりすると(これらのユーティリティは異なるシステムで移植できないため、別のディレクトリに住んでいます)。
ただし、残念ながらcdはbashの組み込みコマンドであるため、これは「完全に」という単語からのcdコマンドでは機能しません。 つまり、「cd localhost」も「ssh <dirname>」も機能しません。
また、常に最初の引数($ 1)のみを調べ、追加のフラグを渡すことはできません。 たとえば、コマンド「ssh localhost uptime」を実行することはできず、代わりにsshをlocalhostに移動します。
改良されたスクリプト
チームに引数を渡さないという事実の問題を少なくとも解決してみましょう。 これを行うために、非常に面白い構成「$ @」があります。これは、エスケープを考慮して、引数のリストを「そのまま」コマンドに転送するのに役立ちます。 これは、すべての引数を1つに結合する「$ *」とは異なります。また、空白文字を含む引数を別の引数に変換する$ *(引用符なし)とは異なります。
そのため、スクリプトの改良バージョン:
#!/bin/sh if [ -d "$1" ]; then echo ', : cd ' "$@" elif [ -f "$1" ]; then vim "$@" else ssh "$@" fi
このスクリプトを/ bin / vimに配置すると、「vim localhost uptime」コマンドが機能するようになります。 しかし、残念ながら他のすべての問題は残ります。 echoを呼び出すことでスクリプト内のcdの問題を解決しましたが、ディレクトリが変更され、cdコマンドを自分で入力する必要がないように、より良い解決策を求めていました。
bashのエイリアス
個人的には、bashの組み込みコマンドを置き換える2つの方法を知っています。エイリアスと関数です。 ただし、エイリアスの機能は非常に制限されており、関数に渡される引数にアクセスできません。
$ alias cd='echo ALL YOUR BASH ARE BELONG TO US; cd' $ cd <some_dir> ALL YOUR BASH ARE BELONG TO US <some_dir>$
bashのエイリアスは非常に単純に機能し、他のエイリアス内では展開しません。 この場合、上記の例は、bashのエイリアスを使用して実行できるほぼすべての例です。
sshcdvim関数
選択肢がほとんどないので、関数を書きましょう。 次のようになります。
function sshcdvim() { if [ -d "$1" ]; then cd "$@" elif [ -f "$1" ]; then vim "$@" else ssh "$@" fi }
このコードを「.bashrc」に配置して、bashを再起動する必要があります。 これで、sshcdvim関数を使用できます。この関数自体が実行するものを選択します。
ただし、関数にcd、vim、またはsshという名前を付けたい場合は、使用しようとすると無限の再帰が再び発生します。
bashのビルトインとコマンドの概念
bashで宣言された関数がスクリプトの実行に影響しないように、bashには2つのキーワードがあります:builtinとcommandです。
コマンド名の前にあるbuiltinキーワードは、関数またはコマンドを実行する必要はなく、組み込みコマンドを実行する必要があることをインタープリターに伝えます。 この場合、このような組み込みコマンドはcdです。
commandキーワードはbuiltinと同じですが、実際のコマンドに使用されます。 この場合、実際のコマンドはvimとsshであるため、使用する必要があります。
最終バージョンは次のようになります。
function ssh() { if [ -d "$1" ]; then builtin cd "$@" elif [ -f "$1" ]; then command vim "$@" else command ssh "$@" fi }
vimおよびcdコマンドの場合、必要に応じてチェックを交換できます。
そのような魔法のバッシュを使用すると、職場の同僚を驚かせたり、テレビでトリックを見せることさえできます! この記事を楽しんでいただき、毎日の仕事に役立つことを願っています。