bashでコマンドを「dfk-1234」または「DFK-nnnnn」(数字はゼロで埋められず、1〜5桁の数字)として使用する関数、エイリアス、またはコマンド補完を作成し、次に「dfkp」コマンドを実行します。したいです。 DFK -nnnn"。
引数は言葉通りに渡さなければなりません。 「dfk-18875 cat file.txt」は「dfpk DFK-18875 cat file.txt」にする必要があります。
コマンドの完成やタブの拡張がうまくいくようですが、数字が変わったらどうすればいいのかわかりません。
最良のアプローチは何ですか?デフォルトのコマンド名を処理できるようになると、残り(大文字と小文字、パラメータなど)も処理できます。
答え1
ヘビーヒット4.0新機能の導入command_not_found_handle
見つからないコマンドを処理するために - 存在する場合は、名前付き関数を呼び出します。この動作を使用して、dfk-NNNまたはDFK-NNNという名前の「プログラム」への呼び出しを傍受し、必要に応じて再実行できます。すでに4.0の動作に依存しているため、大文字と小文字のパラメータ拡張機能も使用します。
command_not_found_handle() {
case "${1,,}" in
(dfk-?|dfk-??|dfk-???|dfk-????|dfk-?????)
echo dfkp "${1^^}" "${@:2}"
return 0
;;
(*)
printf 'bash: %s: command not found\n' "$1" >&2
return 127
;;
esac
}
存在しないコマンドが入力されると、bashは元のコマンドラインを使用してこの関数を呼び出します。このステートメントは、目的のパターンとcase
比較しやすくするために、最初の引数を小文字にします。dfk
コマンドdfk-
が1、2、3、4、または5つの文字で始まり、終了する場合(適切と思われる数字まで締め付ける)、現在のデバッグ目的でエコーされますが、最初の引数はdfkp
大文字バージョンです。最初のdfkエントリと残りのコマンドラインが続きます。
一致しないコマンドの場合は、dfk-NNNN
失敗してシミュレートされたbashエラーメッセージをstderrに印刷して127を返します。 (これは、command_not_found_handleが存在しないようなデフォルトの動作と一致します。)
サンプルセッション(実際のdfkpプログラムがないため、エコーデバッグがインストールされています):
$ dfk-1234
dfkp DFK-1234
$ dfk-18875 cat file.txt
dfkp DFK-18875 cat file.txt
$ some-other-command
bash: some-other-command: command not found
$ dfk-1
dfkp DFK-1
$ dfk-12345
dfkp DFK-12345