シェルスクリプトでよく使用するパスの「エイリアス」を作成しようとしました。私は何かを試しましたが、失敗しました:
myFold="~/Files/Scripts/Main"
cd myFold
bash: cd: myFold: No such file or directory
どうすればそれを機能させることができますか?
ただし、cd ~/Files/Scripts/Main
動作します。
回答:
これは環境変数であるため(エイリアスの定義はで異なります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
in one of the bash startup files like .bashrc
。エイリアスを適切なスタートアップファイルに入れると、すべてのセッションで使用できるようになります。
シェルオプションがあります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
)など、他のシェルにも同様のオプションがあります。
setopt cdablevars
はそうかもしれないように見えますが、私はzshをまったく知りません。
cdable_vars
cd
これは、_cd
関数(complete -o nospace -F _cd cd
)を使用するbash-completionによって提供されるの完了を壊すことに注意してください。これに追加-v
すると(変数を完了するために)機能しますが、望ましくない副作用が発生する可能性があります。私にとっては、タブを完了すると完全な環境が表示されます。
たぶん、リンクを使用する方が良いでしょう
シンボリックリンクまたはソフトリンク(ファイルまたはディレクトリ、より柔軟で自己文書化)
# 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
bashのハッシュテーブルに任意のパスを追加できます。
hash -d <CustomName>=<RealPath>
今、あなたはできるようになりcd ~<CustomName>
ます。永続的にするには、bashrcスクリプトに追加します。
このハッシュテーブルは、コマンドが実行されるたびにコンテンツを検索する必要がないbashのキャッシュを提供することを目的としているため、このテーブルは、キャッシュを無効にするイベント(変更など)でクリアされることに注意して$PATH
ください。
zsh
、では機能しないと思いますbash
。
zsh
少なくとも私のUbuntuシステムではのみ機能するのは事実です。
まず、引用符を削除する必要があります。
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
。
.bashrc
または使用するリソースファイルで定義します。これは、シェルスクリプトではなく、直接のシェルで定義されます。
別のオプションは、シンボリックリンクを使用することです。すなわち:
ln -s ~/Files/Scripts/Main ~/myFold
その後、次のような操作を実行できます~/myFold
。
cp some_file.txt ~/myFold
これにより、ファイルがに配置されます~/Files/Scripts/Main
。シンボリックリンクは、でいつでも削除できrm ~/myFold
ます。これにより、元のディレクトリが保持されます。
cd myFold
、その後pwd
、それはあなたがmyFoldにしているが表示されます。p4ソース管理を使用した相対コマンドは現在のディレクトリに依存するため、これは私にとって大きな問題です。
pwd -P
私が試した前述の回答では、エイリアスディレクトリのサブディレクトリの自動拡張(オートコンプリート)は許可されていません。
ただし、エイリアスを作成するディレクトリを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
myscriptに次の行を入れてください
set myFold = '~/Files/Scripts/Main'
ターミナルでの使用
source myscript
cd $myFold