「,,」を「..」にエイリアスできますか?


41

親ディレクトリに変更したいときに、間違えて間違って入力するcd ,,ことがありcd ..ます。これらのステートメントを同じものとbashに考慮させる方法はありますか?コマンドでコンマを使用することはありません。理想的には、にエイリアス,,したいと思い..ます。これを試したところ、うまくいきませんでした。なぜこれが機能しなかったのですか?この問題に他にどのようにアプローチできますか?

$ alias ,,=..
$ cd ,,
-bash: cd: ,,: No such file or directory

6
エイリアスは実行するプログラムであり、プログラムの引数ではありません。その$ ,,ような、文句を言うでしょう:bash: ..: Is a directory。(つまり、実行可能ファイルではありません。)
jpaugh

5
@jpaugh:より明確な言い方をすると、エイリアスの展開はコマンドの最初の「単語」でのみ行われます。あなたが言うように、それは引数ではなくコマンド名に対してのみ機能します。(そして、あなたもできませんでしたalias 'cd ,,'='cd ..'。まあ、できました、しかし、あなたはcd\ ,,それをすべて一言にするためにそれを走らなければなりませんでした。)
ピーターコーデス

5
zshを検討してください。グローバルエイリアスがあるためalias -g ,,=..cd ,,期待どおりに機能します。
ムル

1
ラテラル思考:find / -type d -exec ln -s .. {}/,, \;... ;-)
トビースパイト

2
私見:これをしないでください。エイリアスを使用して誤植を隠すことは悪い習慣です。これらのエラーは、コピーアンドペーストされたコードまたはスクリーンキャストで終わる可能性があります。他のホストまたはアカウントでは機能しません。そして、そのような変更(実装方法によって異なります)は、他の予期しない、デバッグが困難なエラーを引き起こす可能性があります。私の提案:コマンドの入力を間違えた場合は、単にもう一度入力してください;-)。
-jjmontes

回答:


45

ZSH:

zsh alias -g ,,=".."あなたが使用しているのがあなたが必要なものであるが、これはで使用されcdたときだけでなく、どこでも ",,"が展開される原因になります。

からman zshbuiltins

場合 -g フラグが存在している、グローバルエイリアスを定義します。グローバルエイリアスは、コマンドの位置に出現しなくても展開されます。

BASH:

bash(質問にタグが付けられているため)に制限されている場合は、次をお読みください。

これは要求されるように、純粋なエイリアスソリューションです、しかし(私の記事の最後に警告を参照)、これは、ユーザーをイライラおそらく必要以上のことを行います。

引用man bash

エイリアス値の最後の文字が空白の場合、エイリアスに続く次のコマンドワードのエイリアス展開もチェックされます。

したがって、それは別名に十分だcd(その次の引数を拡大できるようにする)余分なスペースで、次いでエイリアス,,..。それを見て

alias cd='cd '
alias ,,='..'

まさに必要なものを提供します。

これはbash(およびそのalias実装)だけでなく、すべてのPOSIXコンパイルシェルでも正しいことに注意してください。例を引用しますman 1p alias(マニュアルでは、この機能を明示的に説明するのではなく、例を示します):

  1. nohupをセットアップして、それ自体がエイリアス名である引数を処理できるようにします。

           alias nohup="nohup "

警告: @PeterCordesは彼のコメントに書いているように、後に書かれたときに他のエイリアスを自動的に展開しcdます。それは書くためにあなたが必要な場合がありcd \grepますが、名前のいずれかにディレクトリを変更したい場合grepしかし、あなたはgrepの別名ですgrep --color=auto。バックスラッシュなしでは、cd「引数が多すぎます」エラーを報告します(cd一度に2つのディレクトリに送信することはできません)。


22
それは賢いが厄介なハックです。私はそれをしたくありません。そのために誤って噛むのは簡単すぎます。たとえば、よく実行するコマンドのエイリアスがあり、cdそのソースコードのディレクトリに移動する場合。または、エイリアスと一般的なディレクトリ名の間の他の衝突。同様にcd drに拡大するcd disown -rこのエイリアスで、私のために。とにかく、cdこのようなIMOのような関数でビルトインをオーバーライドすることをお勧めします。
ピーターコーデス

8
純粋なエイリアスソリューションの+1(何かを学びました)。同時に、私はピーターのコメントに同意します。答えに何らかの明示的な警告を追加する必要があると思います。
カミルマシオロウスキ

58

エイリアスはこれを行うためのものではありませんがcd、実際のラッパーと呼ばれる関数を作成できますcd。これは私のために働く!.bash_profile好みのプロファイルファイルに入れるだけです。

cd () { if [ "$1" = ",," ]; then builtin cd ..; else builtin cd "$@"; fi; }

または、コメントときれいなフォーマットで:

cd ()
{
  if [ "$1" = ",," ]; then  # if first argument is ",,"...
    builtin cd ..           # call the builtin cd with ".." instead...
  else
    builtin cd "$@"         # else call builtin cd with original arguments 
  fi
}

編集

@derobert if then elseがここよりも良いことを指摘してくれてありがとう&& ||。また、この実装は、非パス引数(つまり)が最初の引数でない場合にのみ機能することを認識しました(* facepalm *)-L -P。したがって、タイピングの習慣が悪い場合は、cd -L ,,これは役に立ちません。そして、それは正しく処理するのは簡単なことではないと思います。


16
@BenjiWiebe「コメントときれいなフォーマット」バージョンはif-then-elseの方が良いと思います。
-zwol

うわー、たくさんの良いアイデア。編集機能を使用して、必要な修正を処理しているようです。私はそれをテストするのに多くの時間を費やしませんでした。:)
BenjiWiebe

1
または、$1ビルトインを実行する前に上書きするだけです:cd () { [ "$1" = ",," ] && set .. ; cd "$@"; }
Toby Speight

1
@TobySpeight set .. "${@:2}"、または最初の引数の後に何かを失う。
-chepner

8
また、技術的に..は最初の引数である必要はありません。cd中にはbashさまざまなオプションを取ることができます(-P-L-@-e)。
-chepner

29

エイリアスはコマンドの最初の単語でなければなりません。また、単語の代わりにエイリアスを使用する必要があるため、スペースは使用できません)。

Bashリファレンスマニュアル:エイリアス

エイリアスを使用すると、単純なコマンドの最初の単語として使用されている場合、単語の代わりに文字列を使用できます。

..との両方にエイリアスを作成でき,,ますcd ..

$ alias ..="cd .."
$ alias ,,="cd .."
$ cd /tmp && pwd
/tmp
$ ,, && pwd
/

それはまさに私がやっていることです!:Dこれらの2つのドット/コンマは、入力するのがはるかに簡単ですcd ..
-rav_kr

10
+1、それは悪い考えではありません。.. Bash で別の方法をshopt -s autocd使用すると、名前を入力するだけで任意のディレクトリに変更できます。もちろん、まだあなたの別名,,
ilkkachu


3

..ディレクトリを変更する別の方法は、Bashのautocd 機能を有効にすることです

shopt -s autocd 

名前を入力すると、ディレクトリが自動的に変更されます。

~$ /tmp
cd /tmp
/tmp$ 

あなたはまだエイリアスを作成する必要,,がありますが、それはちょうどで行うことができますalias ,,=..


2

そのためのスクリプトを備えたアプリが既にありますhttps : //github.com/shyiko/commacd(Stanley Shuyikoとの提携はありません)。

commacd次の3つのコマンドをエクスポートします:(,前方へのジャンプ)、,,(後方)、および,,,(後方+前方):

これらの3つはすべて、最初にプレフィックスで一致しようとします。結果が見つからない場合にのみ、サブストリング(ファジー)マッチングにフォールバックします

質問に答えるために、スクリプトはカンマを定義する3つの関数にエイリアスします。

alias ,=_commacd_forward
alias ,,=_commacd_backward
alias ,,,=_commacd_backward_forward
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.