web-dev-qa-db-ja.com

シェルのすべてのコマンドに接頭辞を付ける

毎回入力せずに、シェルのすべてのコマンドにプレフィックスを付けるにはどうすればよいですか?

私のユースケース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
21
iybkyqjpbEP

次のような関数を使用できます。

use_prefix () {
    while read -ra c; do
        "$@" "${c[@]}"
    done
}

これは、use_prefixコマンドの引数として接頭辞を受け入れ、接頭辞を付ける各コマンドのstdinから読み取ります。

注:読み取りループを終了するには、ctrl + cを使用する必要があります。

16
jesse_b

xargsを使用することもできますが、その使用に関連して 警告 を考慮する必要があります

xargs -L1 git

次に、initadd -Aなどを1行に1つずつ入力します

13
iruvar

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を空にします。

10

解決策の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を有効にし、何をしているのかを知らせるプロンプトを追加します。

8
bxm

こんにちは、サイトへようこそ。

これに対する回避策の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

ただし、セッションごとにこれらのエイリアスをリセットする必要があります。

4
CyberStems

基本的に、特定のコマンド用の汎用サブシェルが必要です。

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することもできます。

1
bishop

Linuxの.bashrcファイルにエイリアスを作成できます:alias init = "git init"

端末からinitコマンドを実行すると、自動的に「git init」コマンドが呼び出されます。

0
Nikita Bakshi

Bashを使用すると仮定すると、上記のようにこれを行うには多くの方法があります。これが私が最も便利だと思ったものです-YMMV:

  1. 使用する「ショートカット」ごとに関数を作成します。
  2. このような関数はすべて、たとえば~/.bash_aliasesというファイルに保存します。
  3. .bash_profileでこのファイルを入手してください。
  4. 引数が後に続く関数を呼び出します。

厳密に言うと、ファイルにはエイリアスが含まれていませんが、混乱を避けるためにその名前を使用しています。あなたはそれを.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。

0
Hopping Bunny