で現在のディレクトリを変更するスクリプト (cd、pwd) ターミナルディレクトリを変更する bash スクリプトを実行する方法を示します。
しかし、ターミナル ディレクトリを変更する bash スクリプトを実行する perl スクリプトを実行するにはどうすればよいでしょうか?
答え1
あなたはできません。
Perl スクリプトは、シェル セッションの子プロセスで実行されます。この子プロセスは、自分の作業ディレクトリを自由に変更できますが、親の作業ディレクトリを変更することはできません。Perl スクリプトが終了すると、制御は親プロセス (シェル セッション) に戻されます。親プロセスは、実行中に子プロセスが何をしたかに関係なく、ずっと同じ作業ディレクトリに留まります。
答え2
そんなことはできない直接シェルが現在のディレクトリを変更する唯一の方法は、シェル自体がコマンドcd(またはpushd、popdなど) を実行することです。
しかし、間接的に行うこともできます。現在のディレクトリを次のように変更する簡単な例を次に示します/tmp。
cd-tmp.pl:
#!/usr/bin/perl
print "cd /tmp\n";
あなたの.bashrcまたは.bash_profile:
cd-tmp() { eval $(cd-tmp.pl); }
これは、がcd-tmp.plディレクトリ内にあることを前提としています$PATH。または、関数内でフルパスを指定することもできます。
cd-tmpシェルプロンプトに入力すると、 が呼び出されcd-tmp.pl、その出力がキャプチャされ、その出力がシェルコマンドとして実行されます。
Perl スクリプトは呼び出し元のシェルにディレクトリを変更させることはできませんが、シェルが自身で実行できるコマンドを提供することはできます。
もちろん/tmp、他の情報に基づいて決定されたディレクトリや、その場で作成されたディレクトリなど、 以外のディレクトリを使用することもできます。
明確にしておきたい点が 1 つあります。現在のディレクトリは、ターミナルのプロパティではなく、現在のシェル プロセスのプロパティです。
アップデート :
質問の一部を見逃していたことに気付きました。「bashスクリプトを実行するperlスクリプト」が必要です。私の例を修正してそれを実現するのは簡単ですが、私にはわかりません。なぜbash スクリプトを実行するには Perl スクリプトが必要です。実際に何を達成しようとしているのか、十分に説明されていません。
答え3
方法は複数あります(ティムトウトディPerl から外部コマンドを実行する方法 ( ) がいくつかあります。 を使用したりexec()、バッククォート (``) を使用したりします。Perl スクリプトから外部コマンドを直接実行できる場合は、別の Bash スクリプトを呼び出す必要はないと思います (ただし、呼び出すこともできます)。詳細については、以下のリンクを参照してください。また、プログラム内で行われた変更はサブシェルにのみ影響し、プログラム全体でのみ有効になります。これは常に良いことですが、変更を永続的にする方法があります。つまり、親シェルにも影響します。
http://www.perlhowto.com/executing_external_commands
アップデート-
「他の方法でそれを行う方法」に関するいくつかの質問。特殊な要件には、特殊な解決策(機能するもの)があるはずです。しかし、問題は、なぜ Perl を使用して親シェル ディレクトリを変更するのかということです。とにかく、次のようにします。
$cat test.pl
print "Hello world\n";
print "cd ..";
$pwd
/home/user/perlcode
$eval `perl test.pl|tee -a test.pl.log|grep cd`
$pwd
/home/user
答え4
もう 1 つの解決策は、最初にアクセスしたいディレクトリを文字列変数に保存することです。
例:
$cd_path = "/var/tmp";
$cmd_to_run = "cd $cd_path ; ls -lrt";
system($cmd_to_run);


