bashスクリプトCDディレクトリの入力

bashスクリプトCDディレクトリの入力

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新しい作業ディレクトリで実行されていることがわかります。どうですか?

答えはここにあります(https://superuser.com/questions/176783/what-is-the-difference-Between-executing-a-bash-script-and-commerce-a-bash-scrip#176788)

短い答え:調達は現在のシェルプロセスでコマンドを実行します。 Execute は新しいシェルプロセスでコマンドを実行します。まだ混乱していますか?長い答えを読んでください。

すぐに現在のシェルで$ PWDを変更するには、次のスクリプトを「インポートする」必要があります。

source /path/to/script

または

. /path/to/script

source3番目のポイント: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"

新しい仮想ホストを作成するためのスクリプトを作成するときにこの方法が効果的です。 「フロントウィンドウの境界設定」はオプションです。

関連情報