2009-08-25 6 views
1

私はちょうどthis非常に有用なシェルスクリプトを見つけましたが、残念ながらMac OS X 10.5では動作しません。私が一番最後にecho $Pしようとしましたが、それが正しい道を戻っていますが、それでもcd $P動作していないようですシェルファイルシステム内のN個のフォルダに移動するスクリプト

#!/bin/bash 
LIMIT=$1 
P=$PWD 
for ((i=1; i <= LIMIT; i++)) 
do 
    P=$P/.. 
done 
cd $P 

これは質問(利便性のためにそれをコピーした)でスクリプトです。

端末に手動でP="some/path"cd $Pと入力してみました。

同じコマンドがスクリプトで動作しない理由はありません。それはセキュリティの問題でしょうか?

提案がありますか?

答えて

5

スクリプトプロセスのCWDに影響を与えるだろう、これは何が起こるかです:

コマンドがサブシェルで起動され、そのサブシェルでパスが変更されても、スクリプトが終了したときに開始(親)シェルに戻るため、変更が表示されません。

私はこのように、機能としての私の.bashrcにその便利なスクリプトを置くことによって、これを解決:

up(){ 
    #code goes here 
} 

別のオプションは、スクリプトにあなたがそれを起動するたびにソースすることですが、私は最初のものを好みます。

+0

あなたは.bashrcののMAC相当が何であるかを知っているだけで "アップ"(bashrcに私のホームディレクトリには存在しません)?私はMac標準のシェルが何であるか知りません:-( –

+1

.bashrcを持っていないと、いつでもそれを作成したり、編集することができます。 – ennuikiller

+0

〜/ .bash_profileや〜/ .profileはありますか? –

2

シェルスクリプトが終了すると、実行されたディレクトリに戻ります。 CDは、私だけは、私はいくつかの検索の後に見つけたものを正しく理解している場合、私は、実際には、Linux上で同じ問題を持っていた

2

スクリプトを起動した元のシェルプログラムではなく、スクリプトをインタープリタとして実行しているシェルのコピーの作業ディレクトリのみを変更しています。

bashのようなシェルの場合、対話型シェルセッションで動作する一連のコマンドを実行するには、それらをシェル関数として定義できます。

up() { LIMIT=$1; P=$PWD; for ((i=1; i <= LIMIT; i++)); do P=$P/..; done; cd $P; } 

を入力して、あなたが意図したように動作しますアップコマンドを定義します。

この関数定義は、ログイン時にソースとなるファイル(.bashrcなど)に配置して、ログイン時に便利に定義できます。

1

あなたの現在のシェルのコンテキスト内でスクリプトを実行したい場合は、単に(CDUPと呼ばれていると仮定すると、あなたのシェルスクリプト)次のいずれか

. cdup 3 
source cdup 3 

sourceコマンド行う(とそのエイリアス。)の実行をあなたの現在のシェルのコンテキスト内で提供されたスクリプト、つまりコマンドを実行するために別のサブシェルを起動しないので、あなたのcdは現在のシェル内で動作するようになります。

+0

私はsourceコマンドについて知らなかった。ありがとう! –

1

up()値なしのテストを追加します。

LIMIT = $ 1
[-z "$ LIMIT"];その後、
LIMIT = 1
Fiの

とこれ以上の "CD .." - 有望なようだが、やる

+0

ありがとう、それは非常に便利です。 –

関連する問題