存在する現在のディレクトリを変更するスクリプト(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
他の情報によって決定されたディレクトリや動的に作成されたディレクトリなど、ディレクトリ以外のディレクトリを使用することもできます。
明確にする必要があるのは、現在のディレクトリが端末ではなく現在のシェルプロセスの属性であることです。
修正する:
私はあなたの質問のいくつかを逃したことに気づきました。 「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
別の解決策は、最初にアクセスしたいディレクトリを文字列変数に格納することです。
たとえば、次のようになります。
$cd_path = "/var/tmp";
$cmd_to_run = "cd $cd_path ; ls -lrt";
system($cmd_to_run);