私は私ができることを知っていますシェルまたはスクリプトを実行する代わりにインポートcd
私が使用するシェルに。私が知りたいのはそこにあります。どの「親シェル」に移動しますcd
(正しいフレーズかどうかわからない)。
#!/bin/sh
# This is script.sh
cd $1
pwd
以下はいくつかの結果です。 (メモ:正確な出力ではなく、不要な部分を除去して短くしました。私がシェルに入力した行は>
。 )
> mkdir foo
> ./script.sh foo
/home/myName/foo
> pwd
/home/myName
私が理解している限り、これは予想される動作です。これが私がスクリプトを「得る」ときに起こるものです。
> . ./script.sh foo
/home/myName/foo
> pwd
/home/myName/foo
スクリプトをインポートしてシェルプロシージャにすることなく、ディレクトリ./script.sh foo
に使用されるシェルに結果を入力する方法はありますか/home/myName/foo
?
答え1
いいえ。スクリプトを として呼び出すと、./script.sh foo
スクリプトを実行するサブシェルが起動するためです。サブシェルが終了すると、スクリプトを起動したディレクトリに戻ります。ただし、次のようなスクリプトを使用してこの動作を偽にすることはできます。
#!/bin/bash
cd $1
bash
ディレクトリを変更したら、サブシェルに移動してから元のexit
シェルに戻る必要があります。
最後の行に変更する場合:
exec bash
新しいシェルは古いシェルを置き換えるため、新しいシェルを終了する必要はありません。しかし、これはまだ醜いハッキングです(IMHO)。
答え2
簡単な答えは「いいえ」です。不可能です。
しかし、絶望的であれば、いくつかの回避策を見つけることができます。
最も簡単な方法は、いくつかのディレクトリだけが必要な場合です。事前に知っておいてください(親シェルで)スクリプトが入力cd
を試みることができる場所。この場合、スクリプトから送信された特定の信号のトラップを設定できます。
~ $ cat script
#!/bin/bash
kill -s SIGINT "$PPID"
~ $ trap 'cd /tmp' SIGINT
~ $ ./script
/tmp $
これを行うより洗練された方法は、スクリプトのコマンドを親シェルの標準入力に書き込むことです。手順を説明します(やや複雑です)。ここただし、最も単純な場合(ディレクトリを事前定義する場合)も簡単です。
~ $ cat script
#!/bin/bash
printf '\e[5n' >/proc/"$PPID"/fd/0
~ $ bind '"\e[0n": "cd /tmp\n"'
~ $ ./script
/tmp $
スクリプトから親シェルにディレクトリ名をパラメータとして渡すには、上記のリンクで答えを確認することをお勧めします。
答え3
あなたは試すことができます:
gdb --batch -ex 'call chdir("/some/dir")' -p "$PPID"
しかし、現在のディレクトリが変更されると、ほとんどのシェルが混乱することが予想されます。
ただし、シェル構文では、変数の周りに引用符を入れて、--
オプションと引数を区別する必要があります。cd
失敗した場合の特別な動作も参照してください-P
。したがって、コードは次のようになります。
#! /bin/sh -
cd -P -- "$1"
例:int main(int argc, char*argv[]){chdir(argv[1])}
C言語に対応する(他のプロセスの現在のディレクトリを変更しても効果はありません)
答え4
スクリプトはサブシェルで実行され、すべての環境変更(ディレクトリと変数)はそのプロセスにローカルであり、プロセスが終了または制御を元に戻すと、呼び出しプロセスの環境変更に戻ります。
コマンドを実行できます現在のシェルから(その効果はまだ持続します)スクリプト(. here/is/the/script
)を取得するか、シェル関数を定義することによって。シェル機能は非常に複雑な場合があり、最も重要なことは、現在のシェルプロセス内で実行されていることです。すべてのシェルが機能をサポートしているわけではありません(bashはサポートしています)。