• ベストアンサー

シェルスクリプト内のcdで、カレントディレクトリを変えるには?

シェルスクリプト内のcdコマンドで、カレントディレクトリを変えるにはどうしたらいいか?をどうか教えて下さい。 MS-DOSのバッチファイル内で"cd XXXXX"と書き実行した時の動作を、UNIX(CygWin)環境でも行いたいです。 が、シェルスクリプトは(サブシェルで動く為)カレントディレクトリが変わってくれません。aliasコマンド等でいろいろ実験しましたが、DOSバッチファイルのように「バッチファイル単体でディレクトリ移動が出来る方法」を探し出せませんでした。 極めて初歩的とは存じますが、どうか宜しくお願い致します。

noname#32535
noname#32535

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.3

カレントディレクトリはプロセスの属性なので、子プロセス内で変更しても親には影響しないというのはおわかりのようなので、親プロセスの中で実行すればいいわけです。 今実行しているシェルプロセスの中でスクリプトファイルに書かれたコマンド群を実行するには、ピリオドコマンドもしくはsourceコマンドを使います。 . スクリプトファイル名 か source スクリプトファイル名 で実行してください。 別の方法としては、やりたいことをスクリプトファイルに書くのでなく、aliasや関数で定義するという方法もあります。 たとえば引数がディレクトリならそこにcdする関数は、 cddd() { test -d $1 && cd $1; } と.bashrcなどで定義します。

noname#32535
質問者

お礼

接頭辞shの代わりに.を使うように致します。最も単純に実現できました。どうも有難うございます。

その他の回答 (2)

  • foobar
  • ベストアンサー率44% (1423/3185)
回答No.2

DOSのバッチファイルとどうような処理をさせようとすると,sourceコマンドを使うことになるかと思います. 例えば,cdを含むスクリプトscr.sh を書いておいて, source ./scr.sh とやるとか. (で,これをaliasで別名を割り振ることになるかと.その場合, scr.sh は絶対パスを指定する必要が出てきますが)

noname#32535
質問者

補足

期待通りになりました。どうも有難うございました。 が、No3の方がより単純な . の方法を教えてくださりました。 それを使おうと思います。

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.1

(cd hoge; command1; command2;...) のように()でsub shellを起動後cdします。

関連するQ&A

  • msys(cygwin)で、シェルスクリプトのcdが動かないのは何故?

    msys(又はcygwin)で、シェルスクリプトに書いたcdが働きません。その解決方法を伺っても宜しいでしょうか?具体的には、下のような状況です。 [シェルスクリプト内容] #!/bin/bash echo cd前 cd testdir # ↑testdirは既存。コマンドラインから手打ちすると機能する! echo cd後 [実行結果の表示] cd前 : No such file or directory cd後 [環境] ・WinXP + 最新全パッチ適用 ・msysとcygwinをインストール 以上 どうか宜しくお願い致します。

  • Linuxシェルスクリプトを新しいコマンドにしたい

    Linux初級者です。よろしくお願いします。 OSにFedora Core 10, シェルにtcshを使用しています。 よく使用するコマンドを、まとめて一括で実行するように、 新しいコマンドを作成したくて、次のようなことをしていたのですが (1)ホームディレクトリにmybinというディレクトリを作成してPATHを通す。 (2)newbin1という以下の内容のシェルスクリプトを作成して、~/mybinに置いておく。 ================================== #!/bin/tcsh -f date #実行コマンド例1 echo $PATH #実行コマンド例2 ================================== (3)chmodコマンドでファイルに実行権限を与える。 上記のような方法で、作成したシェルスクリプト(newbin1)を PATHの通ったディレクトリ(~/mybin)に置いて、 > newbin1 とコマンドを呼び出しても、 "newbin1: コマンドが見つかりません" というエラーになってしまいます。 > which newbin1 とすると、ちゃんとファイルのパスが表示されるのですが、 *********************************************************** 自分で作成したシェルスクリプト(newbin1)を、 新しいコマンドとして認識させるにはどのようにすればよいのでしょうか。 また、そもそもシェルスクリプトを新しいコマンドにすることが 不可能だったりするんでしょうか? ************************************************************ 一括で実行したいコマンドが多い場合に、aliasで割り当てるのが大変なので、 できればaliasコマンドは使わずにできる方法を探しています。 基本的な質問かもしれませんが、よろしくお願い致します。

  • シェルスクリプトの引数について

    test.sh '*.c' といったコマンドを入力した時に、 シェルスクリプト内で引数$1を受け取ったときに$1='*.c'となるのではなく、 カレントディレクトリ内にある'*.c'の正規表現にマッチするファイルが入ってしまっています。 例)カレントディレクト内にaaa.cファイルbbb.cファイルといったファイルがある時は、 $1=aaa.c bbb.cとなっています。 '*.c'の正規表現自体をシェルスクリプト内で受け取る方法はないのでしょうか? シェルはbashを使用しています。

  • カレントディレクトリの取得

    お世話になります。 バッチファイルでの処理中にカレントディレクトリをフルパスで取得し 変数に値を格納したいのですが、やり方が分かりません。。 いろいろ調べた結果、カレントディレクトリの取得は「CD」 変数への格納は、「==」or「set」なのかな?ってぐらいの知識レベルです。 上記のコマンド以外でも構いませんので、カレントディレクトリを取得し 変数に値を格納する方法を、記述の仕方を含めてご教示くださいませ。 宜しくお願い致します。

  • Cygwinのシェルスクリプトから、DOSのバッチファイルを起動できる?

    Cygwin(bash)で使うシェルスクリプトの中から、MS-DOSのバッチファイル(.bat)を起動できるでしょうか? 実験では不可能( Cygwin(bash)からcommand not found と言われてしまう)でした。が、もしかしたら裏技的にできる方法をご存知の方がいらっしゃるかと思い、質問させて頂きました。 以上どうぞ宜しくお願い致します。

  • UNIXのシェルスクリプト

    UNIXのシェルスクリプトで以下のようなことをやりたいのですがいい方法を教えて下さい。 ファイルの中にある文字列があります。 たとえば”CURREND_DIR” この文字列をシェルスクリプトでカレントのディレクトリパスに変換したいのですが いい方法が思いつきません。 set dir_data = ‘pwd‘ sed -e ’s/CURRENT_DIR/$dir_data’ ファイル名 でできるかなと思ったのですが、”CURRENT_DIR”が”$dir_data”に置換されてしまいます。 さらにdirパスが”/”で区切られていることも問題のようです。

  • DOSコマンドでカレントディレクトリのディレクトリ名を一括取得

    DOSコマンドでカレントディレクトリのディレクトリ名を一括取得 DOSコマンドにて、カレントディレクトリ名を取得するのは、 for %I in (.) do set DIRNAME1=%~nI%~xI このようなコマンドでできると思います。 しかし、DOSコマンドにて「カレントディレクトリの中のディレクトリ名」を 一括取得して、複数の変数に保存する方法がわかりません。 以上、よろしくお願いします。

  • シェルでチェンジディレクトリを記述する方法

    Linuxのシェルでチェンジディレクトリコマンドcdで単純に目的のディレクトリに 移動するよう、記述しましたが、カレントディレクトリが移動しませんでした。 正しい書き方を教えて下さい。(初心ですがよろしくお願いいたします) cd /tmp/abc

  • MS-DOSでカレントフォルダ以外のコマンドを認識

    MS-DOSのアプリケーションを使っているのですが、あるPCでは、カレントディレクトリにないコマンドがディレクトリ指定などなくても、コマンド名だけで実行されるのに、別のPCではコマンドファイル自体がカレントディレクトリに存在しないと実行できません。これはどうしてでしょうか?DOSの動作設定で認識の範囲が設定されているのでしょうか?それは変更できるのでしょうか?よろしくお願いいたします。

  • カレントディレクトリにあるコマンドについて

    こんにちは。1つ質問させてください。 現在のカレントディレクトリーにある コマンドやシェルを実行するのには フルパスは必要ないと思っていたのですが 認識にあやまりはあるのでしょうか? 「./コマンド」 では成功するのに 「コマンド」  ではcommand not foundになってしまいます。 だんだん混乱してきてしまいました。 よろしくお願い致します。