bashに先行 `:`があるときにこれを無視するようにすることはできますか?

bashに先行 `:`があるときにこれを無視するようにすることはできますか?

通常、bash(macOS)で作業している場合は(Mac)Vimでも動作し、2つを切り替えます。 Vimからターミナルに切り替えた後、私がよく犯す間違いは、コマンドの前にコロンを入れることです。私は:cd /path/to/project/dir/Vimの次のターミナルに切り替えて、同じことを入力します。ただし、もちろんそこからコロンで始めてはいけません。

だからbashコマンドがいつ実行されるのかわかりません。しなければならないコロンで始まり、毎回わざわざそうではありませんでした。それでは、bashがコロン(コマンドの最初の文字である場合)を完全に無視し、次のよう:cd ...に解釈する方法はありますかcd ...

答え1

bash(1)command_not_found_handle()この関数は、定義されていて実行するコマンドが見つからない場合に呼び出されます。この機能をまだ使用していない場合(Ubuntuのcommand-not-foundパッケージなど)、この機能を使用してコロンを削除して再試行できます。

command_not_found_handle() {
    if [[ "${1:0:1}" != : ]]; then
        printf "%s: %s: command not found\n" "$0" "$1" >&2
        return 127
    else
        "${1/#:}" "${@:2}"
    fi
}

その機能を.bashrc

編集:ここには一般的ではない拡張機能があるので、もう少し説明します。

まず、コメントで指摘したように、command_not_found_handleこれはbash 4の機能です。 Bash 4は2009年2月にリリースされました。command_not_found_handleこの関数は、見つからないコマンドとコマンドのパラメーターを使用して呼び出されます。つまり、$1見つからないコマンドであり、$2その後に見つからないコマンドのパラメータがあります。これについては後述する。コマンドの実行マンページから。

"${1:0:1}"位置0から始まる長さ1の部分文字列で始まる拡張です$1。つまり、見つからないコマンドを含む$1最初の文字を抽出します。$1この内容は次のように記録されます。パラメータ拡張マニュアルページでは${parameter:offset:length}

の最初の文字が$1コロンでない場合は、エラーを印刷して終了値127を返します。 127 は、次のように bash が実行するコマンドが見つからないときに使用する終了コードです。コマンドの実行マンページから。

"${1/#:}"$1先行コロンを展開して削除します。最初にコロンがなければNormalと同じです$1が、私たちが処した条件の四半期のためにとにかくコロンで始まることがわかります。この拡張は次に文書化されています。パラメータ拡張マニュアルページから${parameter/pattern/string}

"${@:2}"2番目のパラメータから始まる位置パラメータに展開されます。この拡張は次に文書化されています。パラメータ拡張配列${parameter:offset}@。つまり、部分文字列を抽出する代わりに、配列の要素に展開されます。

最終結果は、見つからないコマンドが実行され、コマンドの前にコロンがある場合は、コロンを削除して新しいコマンドを形成し、元の引数を新しいコマンドに渡すことです。これは、コマンドを実行しようとする2回目の試みが見つからない場合、再度実行されるかのcommand_not_found_handle()ように最終的に再帰的に機能します。これは実行可能で:::mkdirあり、実行が継続されることを意味しますmkdir

関連情報