Mac端末で実行されているこのbashファイルはディレクトリを変更できません。代わりに実際に存在していても不在を報告してください。私は何が間違っていましたか?
#!/usr/bin/env bash
set -e
read name
APPLICATION_PATH="~/Documents/meteor/apps/$name"
cd "${APPLICATION_PATH}"
答え1
2つの点があります。
- チルダ拡張の問題
- 調達と実行の問題。
チルダ部分の場合、SuperUserの最近の質問は同じ問題に関するものです(https://superuser.com/questions/1161493/why-bash-script-wont-extend-bashrc/1161496#1161496)
チルダは変数の前に展開されるため、cd はパスを見つけることができません。この問題を克服するために、eval
コマンドは次のように指定できます。
eval cd "${APPLICATION_PATH}"
残念ながら、スクリプトを実行している場合(呼び出しパス「+ x」でchmodを指定した場合)、$ PWDが「現在のシェル」で変更されていないことがわかります。しかし、スクリプトの最後にこのような行を追加すると、
ls
ls
新しい作業ディレクトリで実行されていることがわかります。どうですか?
短い答え:調達は現在のシェルプロセスでコマンドを実行します。 Execute は新しいシェルプロセスでコマンドを実行します。まだ混乱していますか?長い答えを読んでください。
すぐに現在のシェルで$ PWDを変更するには、次のスクリプトを「インポートする」必要があります。
source /path/to/script
または
. /path/to/script
source
3番目のポイント:orを台無しにしたくない場合は.
〜/.bashrc(https://stackoverflow.com/questions/752525/run-bash-script-as-source-without-source-command):
エイリアス mycmd="source mycmd.sh"
答え2
tilda '~'を使用できます。正しいbash拡張キーをオンにするだけです。
set -x
または、フルパス「/Volumes/Swap/Apps/...」を使用します。
たとえば、bashrcを使用してenvショートカットを設定します。
export LocalApps=/Users/me/Applications
export SysApps=/Applications
evalをどのように使用するのかわかりません。
コマンドラインから文字列を読み取るには、readを使用せずに引数を取得するだけです。
if [[ $# -eq 1 ]]; then
#check if it's directory
if [[ -d $name ]] ; then
#do stuff here
else
echo 'bomb'
fi
else
usage
fi
ディレクトリに "cd"の代わりに〜+、〜-、pushd、およびpoptを使用する方法を学びます。実際にディレクトリに「cd」する必要はありません。
あなたはこのようなことをすることもできます
pushd $SysApps/$name
do stuff
popd
答え3
「」の中に〜を入れないでください。
#!/usr/bin/env bash
set -e
read name
APPLICATION_PATH=~/Documents/meteor/apps/$name
cd "${APPLICATION_PATH}"
pwd
答え4
もう1つの回避策は、使用している現在のターミナルウィンドウのスクリプトから正確にディレクトリにcdしない場合でも、osascriptを使用して別のターミナルを開き、目的のディレクトリにcdすることです。
osascript -e "
tell application \"Terminal\"
do script \"cd $APPLICATION_PATH; pwd;\"
set bounds of front window to {900, 0, 1790, 565}
end tell"
新しい仮想ホストを作成するためのスクリプトを作成するときにこの方法が効果的です。 「フロントウィンドウの境界設定」はオプションです。