プレフィックスとして機能し、スペースを使用せずに解析できるbashエイリアスを作成しようとしています。基本的には、すべて同じ最初の数文字で始まる一連のコマンドがあり、毎回そのプレフィックスを入力する必要なしに実行する前に他のコマンドのプレフィックスを付けたいと思います。
つまり、次のように動作するエイリアスを作成できるようにしたいalias pref="sudo commandtoprefix"
とprefcommand
思いますsudo commandtoprefixcommand
。スペースが不足していることに注意することが重要です。
説明した内容によれば、いつかこれを行うことができると思いましたが、何らかの理由で今は機能せずにエラーを返しますcommand not found
。
私は偶然偶然発見したこの回答しかし、機能を説明するので、スペースが必要であり、これは私の要件を正確に満たしていません。
スペースを使用する必要のないエイリアスや関数を使用してこれを実行する方法はありますか?
答え1
同様のタスクを実行する関数を作成できます。
function pref { prefix$*; }
これにより、より多くの電話が来pref command arg arg
、より多くの電話が来ますprefixcommand arg arg
。
答え2
本当に空白を使用しないように固執し、このようにプレフィックスが付いた可能なコマンドのリストを事前に決定しないと主張する場合、これを達成するために私が考えることができる唯一の方法は、カスタム「コマンドが見つかりません」ハンドラを使用することです。です。 。
command_not_found_handle()
存在しないコマンドを入力すると、Bashはこの関数を呼び出します。関数は最初の4文字があるかどうかを確認しpref
、その場合は次のものが実際のコマンド名であることを確認し、そうであればsudoで実行し、そうでない場合は一般的なエラーを報告することでこれを利用できます。
command_not_found_handle() {
# read the "missing command" entered
missingcmd="$1"
# remove it from the argument list
shift
# check if starts with "pref"
if [[ "${missingcmd:0:4}" == "pref" ]] ; then
# read part after "pref"
prefixedcmd="${missingcmd:4}"
# check if it's a real command
if which "$prefixedcmd" &> /dev/null ; then
# run sudo with the cmd and the rest of the argument list
sudo "$prefixedcmd" "$@"
return $?
fi
fi
# default command not found behavior
echo "bash: $missingcmd: not found" >&2
return 127
}
あなたの.bashrc
。
編集:あなたの質問を誤解している可能性があります。これを実行したいコマンドにはすでに共通のプレフィックスがある可能性があり、特別なsudoを使用してプレフィックスを追加するときは省略します。私のパスを変更しても可能です。
prefixedcmd="${missingcmd:4}"
到着
prefixedcmd="commonprefix${missingcmd:4}"