長い道のりの「エイリアス」を作る方法は?


95

シェルスクリプトでよく使用するパスの「エイリアス」を作成しようとしました。私は何かを試しましたが、失敗しました:

myFold="~/Files/Scripts/Main"
cd myFold

bash: cd: myFold: No such file or directory

どうすればそれを機能させることができますか?
ただし、cd ~/Files/Scripts/Main動作します。

回答:


120

これは環境変数であるため(エイリアスの定義はで異なりますbash)、次のように評価する必要があります。

cd "${myFold}"

または:

cp "${myFold}/someFile" /somewhere/else

しかし、実際には、そのディレクトリに簡単に切り替えたい場合は、(のようなスタートアップファイルの1つに)実際のエイリアスを作成する方が簡単bash.bashrcので、キーストロークを保存できます。

alias myfold='cd ~/Files/Scripts/Main'

次に、(なしでcd)使用できます。

myfold

定義を削除するには、を使用しますunalias。次のトランスクリプトは、これらすべての動作を示しています

pax> cd ; pwd ; ls -ald footy
/home/pax
drwxr-xr-x 2 pax pax 4096 Jul 28 11:00 footy

pax> footydir=/home/pax/footy ; cd "$footydir" ; pwd
/home/pax/footy

pax> cd ; pwd
/home/pax

pax> alias footy='cd /home/pax/footy' ; footy ; pwd
/home/pax/footy

pax> unalias footy ; footy
bash: footy: command not found

ありがとう。それはうまくいきます。エイリアスmyfold = '〜/ some / path'とcdmyfoldのみを試しました。エラーが発生します-そのようなディレクトリはありません。どうして ?また、エイリアス変数を「割り当て解除」することは可能ですか?
bashboy 2013

myfold = '〜/ some / path' cd "$ myfold"が失敗します。どうして ?
bashboy 2013

1
@bashboy、おそらくその名前のディレクトリがないためです。〜/ some / pathは例であり、使用する実際のパスに置き換える必要があります。わかりやすくするために、サンプルディレクトリを使用するように変更します。エイリアスの割り当てを解除する方法については、una​​liasコマンドを使用します。また、そのコマンドの使用を含め、トランスクリプトで回答を更新しました。
paxdiablo 2013

このエイリアスをさまざまなターミナルセッションでどのように保存しますか?新しいタブを開いてこのエイリアスを使おうとすると、機能しません。
goldisfine 2015

4
@goldisfine、私の括弧を参照してくださいin one of the bash startup files like .bashrc。エイリアスを適切なスタートアップファイルに入れると、すべてのセッションで使用できるようになります。
paxdiablo 2015

74

シェルオプションがありますcdable_vars

cdable_vars
これが設定されcdている場合、ディレクトリではない組み込みコマンドへの引数は、値が変更先のディレクトリである変数の名前であると見なされます。

あなたはこれをあなたの.bashrc:に追加することができます

shopt -s cdable_vars
export myFold=$HOME/Files/Scripts/Main

チルダを$HOME;に置き換えたことに注意してください。引用符はチルダの拡張を防ぎ、Bashはディレクトリがないと文句を言い~/Files/Scripts/Mainます。

これで、これを次のように使用できます。

cd myFold

$必要ありません。それが全体のポイントです。実際には、他の回答に示されているようにcd "$myFold"、シェルオプションがなくても機能します。cd myFoldのパスにmyFoldスペースが含まれている場合にも機能し、引用符は必要ありません。

これは通常、タブのオートコンプリートでも_cd機能しbash_completionます。関数cdable_varsが設定されているかどうかを確認しますが、すべての実装が同じ方法で実行するわけではないため、でbash_completion再度ソースを作成する.bashrc(または編集/etc/profileしてシェルオプションを設定する)必要があります。


Zsh(cdablevars)など、他のシェルにも同様のオプションがあります。


1
ZSHにこれに相当するものはありますか?
Ryan Stull 2018

1
@RyanStullsetopt cdablevarsはそうかもしれないように見えますが、私はzshをまったく知りません。
ベンジャミン

@JohnMee編集をロールバックします。a)オプションはzshで別の方法で呼び出されます(アンダースコアなし)b)Bashだけでタグ付けされた質問c)Bashマニュアルにリンクします。ただし、他のシェルについて言及する段落を追加します。
ベンジャミン

1
そのような素晴らしい答え!どうもありがとうございましたcdable_vars
Lucas P.

1
@Vladislavcdこれは、_cd関数(complete -o nospace -F _cd cd)を使用するbash-completionによって提供されるの完了を壊すことに注意してください。これに追加-vすると(変数を完了するために)機能しますが、望ましくない副作用が発生する可能性があります。私にとっては、タブを完了すると完全な環境が表示されます。
ベンジャミンW.

10

たぶん、リンクを使用する方が良いでしょう

ソフトリンク

シンボリックリンクまたはソフトリンク(ファイルまたはディレクトリ、より柔軟で自己文書化)

#      Source                            Link
ln -s /home/jake/doc/test/2000/something /home/jake/xxx

ハードリンク

ハードリンク(ファイルのみ、柔軟性が低く、自己文書化されていない)

#    Source                            Link
ln /home/jake/doc/test/2000/something /home/jake/xxx

ディレクトリへのリンクを作成する方法

ヒント:家にリンクを表示する必要がない場合は、ドットで始めることができます。; その後、デフォルトで非表示になり、次のようにアクセスできます

cd ~/.myHiddelLongDirLink

9

bashのハッシュテーブルに任意のパスを追加できます。

hash -d <CustomName>=<RealPath>

今、あなたはできるようになりcd ~<CustomName>ます。永続的にするには、bashrcスクリプトに追加します。

このハッシュテーブルは、コマンドが実行されるたびにコンテンツを検索する必要がないbashのキャッシュを提供することを目的としているため、このテーブルは、キャッシュを無効にするイベント(変更など)でクリアされることに注意して$PATHください。


2
でのみ機能しzsh、では機能しないと思いますbash
セルゲイ

これは私見のベストアンサーですが、zsh少なくとも私のUbuntuシステムではのみ機能するのは事実です。
ジョンスチュワート

6

まず、引用符を削除する必要があります。

bashboy@host:~$ myFolder=~/Files/Scripts/Main

引用符は、シェルがチルダを$HOMEディレクトリであるという特別な意味に拡張するのを防ぎます。

次に$myFolder、環境をシェル変数として使用できます。

bashboy@host:~$ cd $myFolder
bashboy@host:~/Files/Scripts/Main$

エイリアスを作成するには、エイリアスを定義する必要があります。

alias myfolder="cd $myFolder"

次に、この種のコマンドのように扱うことができます。

bashboy@host:~$ myFolder
bashboy@host:~/Files/Scripts/Main$

あなたがそうしない限り、それは実際には環境変数ではありませんexport
キーストンプソン

1
@KeithThompsonわかりました、これは単なるシェル変数です。ただし、子プロセスに影響を与えたくないため、エクスポートする必要はありません。この方法で、自分.bashrcまたは使用するリソースファイルで定義します。これは、シェルスクリプトではなく、直接のシェルで定義されます。
David W.

自動補完で動作するため、このソリューションが好きです
Vassilis 2017年

5

まず、$質問のコードを機能させるには、「myFold」の値にアクセスする必要があります。

cd "$myFold"

これを単純化するために、次の場所にエイリアスを作成します~/.bashrc

alias cdmain='cd ~/Files/Scripts/Main'

.bashrc現在のbashセッションでエイリアスを使用できるようにするには、一度ソースを設定することを忘れないでください。

source ~/.bashrc

これで、次を使用してフォルダに変更できます。

cdmain

4

別のオプションは、シンボリックリンクを使用することです。すなわち:

ln -s ~/Files/Scripts/Main ~/myFold

その後、次のような操作を実行できます~/myFold

cp some_file.txt ~/myFold

これにより、ファイルがに配置されます~/Files/Scripts/Main。シンボリックリンクは、でいつでも削除できrm ~/myFoldます。これにより、元のディレクトリが保持されます。


一つの欠点:あなたがいる場合cd myFold、その後pwd、それはあなたがmyFoldにしているが表示されます。p4ソース管理を使用した相対コマンドは現在のディレクトリに依存するため、これは私にとって大きな問題です。
user59 1018年

1
@ User5910-使用pwd -P
dvj 2018年

2

ただし、dirの実際のエイリアスも可能です。試してみてください

 myScripts="~/Files/Scripts/Main"
 alias myScripts="cd $myScripts"

このようにして、(dir / aliasのペアごとに)共通の命名規則があり、現在のdirからmyScriptsに何かをコピーする必要がある場合は、それについて考える必要はありません。

IHTH


1

私が試した前述の回答では、エイリアスディレクトリのサブディレクトリの自動拡張(オートコンプリート)は許可されていません。

ただし、エイリアスを作成するディレクトリをdirsスタックにプッシュすると...

$ pushd ~/my/aliased/dir

...次に、入力dirs -vしてスタック内の数値位置を確認できます。

 0  ~/my/aliased/dir
 1  ~/Downloads
 2  /media/usbdrive

ディレクトリパラメータを必要とするすべてではないにしてもほとんどのコマンドについて、その番号を使用して参照します。

 $ mv foo.txt ~0  

Tab「エイリアス」ディレクトリの直接のサブディレクトリを表示するために使用することもできます。

 $ cd ~0/<Tab>
 child_dir1    child_dir2

-1

myscriptに次の行を入れてください

set myFold = '~/Files/Scripts/Main'

ターミナルでの使用

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