毎回入力せずに、シェルのすべてのコマンドにプレフィックスを付けるにはどうすればよいですか?
私のユースケース1:
$ git init
$ git add -A
$ git commit
$ git Push
プレフィックスはgit␣
(␣
はスペース文字です)
init
add -A
commit
Push
私のユースケース2:
Sudo docker run my-repo/my-image
Sudo docker ps
Sudo docker images
プレフィックスはSudo docker␣
run my-repo/my-image
ps
images
このようなことができれば最高です:
$ git init
$ use_prefix Sudo docker
> ps
> images
> exit
$ Sudo docker run my-repo/my-image
次のような関数を使用できます。
use_prefix () {
while read -ra c; do
"$@" "${c[@]}"
done
}
これは、use_prefix
コマンドの引数として接頭辞を受け入れ、接頭辞を付ける各コマンドのstdinから読み取ります。
注:読み取りループを終了するには、ctrl + cを使用する必要があります。
zsh
シェルを使用すると、次のコマンドを実行できます。
zle-line-init() if [[ $CONTEXT = start ]] LBUFFER=$zle_prefix$LBUFFER
zle -N zle-line-init
新しいコマンドラインの入力を開始すると、$zle_prefix
の内容がバッファの先頭に挿入されます。
だからあなたはできる:
zle_prefix='Sudo docker '
そのSudo docker
を後続のコマンドの開始時に挿入します。
primes$zle_prefix
という別のウィジェットを定義して、現在カーソルの前にあるものを指定できます。
prime-zle-prefix() zle_prefix=$LBUFFER
zle -N prime-zle-prefix
bindkey '\eP' prime-zle-prefix
そして、あなたはタイプすることができます
$ Sudo docker Alt+Shift+P ls
次に、Sudo docker
が後続のすべてのコマンドに挿入されます。完了したら、行を空白にします(Ctrl+U)と入力します Alt+Shift+P 再び$zle_prefix
を空にします。
解決策の1つはエイリアスを設定することですが、組み込みのコマンドやシステムバイナリ(ps
など)と衝突する場合は注意が必要です。
~/.bashrc
に次のような行を追加します(次にbashを起動するかsource ~/.bashrc
と入力すると有効になります):
alias commit='git commit'
alias docker='Sudo docker'
alias images='docker images'
alias ps='docker ps'
実際のps
を実行するには、command ps
または\ps
と入力する必要があります。特にエイリアスをスクリプトで使用できるようにしない限り、通常はコマンドラインでの入力にのみ影響します。
あなたが提案するような対話型シェルインターフェイスについては、より複雑なものが必要になります。
つまり、@ Jesse_Bのすばらしい提案の拡張です。
use_prefix () {
while read -p "$* >" -ra c; do
[ "${c[0]}" = "exit" ] && break
"$@" "${c[@]}"
done
}
exit
キーのWordを有効にし、何をしているのかを知らせるプロンプトを追加します。
こんにちは、サイトへようこそ。
これに対する回避策の1つは、aliasing
を使用することです。
「プレフィックス」を無効にしませんが、時間を大幅に節約できます
例えば.
alias g=git
$ g init
$ g add -A
$ g commit
$ g Push
OR
複数の単語がある場合は、引用符を使用します
alias sd="Sudo docker"
sd run my-repo/my-image
sd ps
sd images
ただし、セッションごとにこれらのエイリアスをリセットする必要があります。
基本的に、特定のコマンド用の汎用サブシェルが必要です。
Shell() {
TOPCMD=$@ bash -c 'while read -p "${TOPCMD##*/}> " -ra sub; do
case ${sub[0]:-} in
"") continue;;
exit) exit;;
escape) (set -x; ${sub[@]:1});;
*) (set -x; ${TOPCMD} ${sub[@]});;
esac
done'
}
それで:
$ Shell git -p
git -p> init
+ git -p init
Initialized Git repository in /path/to/.git/
git -p> escape touch foo
+ touch foo
git -p> add .
+ git -p add .
git -p> status
+ git -p status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: foo
git -p>
入力するコマンドには、元のコマンド(絶対または相対、および引数)がプレフィックスとして付けられます。プロンプトは、元のコマンドを思い出させます。完全にexit
することも、1つのコマンドをescape
することもできます。
Linuxの.bashrcファイルにエイリアスを作成できます:alias init = "git init"
端末からinitコマンドを実行すると、自動的に「git init」コマンドが呼び出されます。
Bashを使用すると仮定すると、上記のようにこれを行うには多くの方法があります。これが私が最も便利だと思ったものです-YMMV:
~/.bash_aliases
というファイルに保存します。.bash_profile
でこのファイルを入手してください。厳密に言うと、ファイルにはエイリアスが含まれていませんが、混乱を避けるためにその名前を使用しています。あなたはそれを.bash_functionsと呼びたいかもしれません。
ここにあなたが始めるための非常に簡単な例があります。実際に引数を渡したかどうかはチェックしません。
$ cat ~/.bash_aliases
g() {
git "$@"
}
sudock() {
Sudo docker "$@"
}
次に、.bash_profile
に次のようにソースを追加する行を追加できます。
. ~/.bash_aliases
次に使用例をいくつか示します。
g status
g commit -m 'initial commit' fileName
sudock run my-repo/my-image
$ @の代わりに$ 1を使用できますが、関数に渡されたすべてを考慮するのではなく、引数が1つしかかかりません。
HTH。