シェルスクリプト内で実行した cd コマンドをターミナルに反映させたい


シェルスクリプト内で実行した cd コマンドの結果のディレクトリへの移動を、そのシェルスクリプトを実行したターミナルに反映させたいと思い、次のようなコードを書いたのですが、"exec: cd: 見つかりません" と言われてしまいます。

#!/bin/bash
exec cd /tmp

対策として、次の2つが思い付きました。ただ、もっとエレガントに、シェルスクリプトの中だけで完結させる方法はないでしょうか。

o シェルスクリプトでは、移動したいディレクトリを echo するだけにする。そしてその結果に対して cd する。
o .bashrc の関数にする

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/01/01 17:37:24
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.2

回答回数4971ベストアンサー獲得回数2153

ポイント190pt

exec は、fork せずに exec システムコールを呼ぶためのコマンドなので、組込コマンドである cd を呼んでも、「見つかりません」、となってしまいます。
質問にある "exec: cd: 見つかりません" は、"exec コマンドが cd を見つけることができない" という意味です。

質問であげられた方法以外に、以下のような感じで、期待してることができると思います。

  • bash の alias を使う
  • exec で、bash を起動する

後者は、こんな感じのスクリプトになります。

#!/bin/bash
cd /tmp
exec /bin/bash

その他の回答1件)

id:kodairabase No.1

回答回数661ベストアンサー獲得回数80

ポイント10pt

Ubuntuを利用されているということなので、下記のようにスーパーユーザーで実行してみて下さい。

sudo exec cd /tmp
id:a-kuma3 No.2

回答回数4971ベストアンサー獲得回数2153ここでベストアンサー

ポイント190pt

exec は、fork せずに exec システムコールを呼ぶためのコマンドなので、組込コマンドである cd を呼んでも、「見つかりません」、となってしまいます。
質問にある "exec: cd: 見つかりません" は、"exec コマンドが cd を見つけることができない" という意味です。

質問であげられた方法以外に、以下のような感じで、期待してることができると思います。

  • bash の alias を使う
  • exec で、bash を起動する

後者は、こんな感じのスクリプトになります。

#!/bin/bash
cd /tmp
exec /bin/bash
  • id:kitokitoki
    なにがしたかったかというと、Ruby のライブラリを gem でインストールしたときに、 Gemfile があっても依存ライブラリは入れてくれないみたいなので、該当ライブラリの Gemfile があるディレクトリに移動するコマンドが欲しかった、ということです。
    おおよそ次のような Bashスクリプトです。 https://gist.github.com/1546092
  • id:kodairabase
    どんなOSを使っているのか分からないと回答しようがありません。
    Built-in コマンドにexecがないところから、シェルはbashではないのではありませんか?
  • id:kitokitoki
    > id:kodairabase さん
    OS は Ubuntu 11.04 です。uname -a すると以下のようになります。
    Linux x200 2.6.38-13-generic #52-Ubuntu SMP Tue Nov 8 16:48:07 UTC 2011 i686 i686 i386 GNU/Linux
    それから、type exec すると「exec はシェル組み込み関数です」と表示されます。
  • id:kitokitoki
    a-kuma3 の回答に対する「この回答いい!」ボタンの下の入力エリアにコメントしたのですが、反映されていなかったのでここにもコメント。exec /bin/bash、たいへん感動しました。ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません