プロセスの強制終了は、.batファイルと.shファイルで異なる方法で動作しますか?


0

この質問は2つのパートに分かれています。ごめんなさい 最初の質問:bashスクリプト(.sh)を使用してそのスクリプト内のディレクトリを変更し、その後スクリプトの実行中にスクリプトを強制終了すると、開始したディレクトリに戻ります。しかし、これをしようとするとで.bat、スクリプト、と私は使用chdirする代わりにcd、私はディレクトリにいる、そのプロセスを殺す、chdirとD」。例:

#runscript.sh
cd seconddir/thirddir/
# run some ongoing process here
----------------------------------
usr/firstdir> ./runscript.sh
[Ctrl + C]
usr/firstdir>

次に、2番目の場合:

#runscript.bat
chdir seconddir/thirddir/
# run some ongoing process here
----------------------------------
usr/firstdir> runscript.bat
[Ctrl + C]
usr/firstdir/thirddir>

なぜこれが起こるのですか?.batプロセスが終了した後にスクリプトを元に戻すことはできますCtrl + cか?


.batファイルの名前を.cmdに変更した場合、動作は異なりますか?.batはMS-DOS時代からの古い拡張子であり、そのため、エミュレーションによって動作が異なりますが、.cmdは最新のものです。
LPChip

また、ウィンドウにラベルを付けますが、あなたの質問全体がLinuxを叫んでいます。どのOSを使用していますか?
LPChip

@LPChipウィンドウ。なぜLinuxでbatスクリプトを使用するのですか?
awallace04

WindowsパスはC:\folder1\folder2、Linuxスタイルのパスを使用する場所を使用します。また、shスクリプトはWindowsでは一般的ではありませんが、不可能ではありません。そのため、Linuxをwineと組み合わせて使用​​する可能性がはるかに高いように思われます。それが私が尋ねた理由です。
LPChip

ああ、私はあなたが何を意味するかわかります。いいえ、Windowsを使用していますが、理由により、同じことを行う.shおよび.batスクリプトが必要です。最初の質問に答えるために、.cmdに変更しても何も変わりません。
-awallace04

回答:


0

現在のディレクトリは、プロセスのプロパティです。異なるプロセスは異なる現在のディレクトリを持つことができ、プロセスは別のプロセスの現在のディレクトリを変更できません。

コマンドウィンドウ(DOSウィンドウと呼ばれることもあります)を開くと、起動しcmd.exeます。これcmd.exeにより、キーボードで入力したコマンド.batや、.cmdファイルからのコマンドを実行できます。.shファイルについては知りません。

シェルスクリプト.shは、シェル、別のプロセスを起動することで実行され、.shファイル内のコマンドはシェルプロセスの現在のディレクトリを変更します。コマンドインタープリターのディレクトリは変更しませんcmd.exe

バッチファイルはコマンドインタープリターによって実行されます。cmd.exeそのため、コマンドインタープリターの現在のディレクトリが変更されます。この変更は、バッチファイルの実行が終了した後も引き続き有効です。


バッチスクリプトをシェルスクリプトのように動作させる方法はありますか?cd新しいプロセスで試しましたが、うまくいきません。
-awallace04

いいえ、できません。それは機能していますが、その新しいプロセスの中でのみです。
RalfFriedl

答え自体に「同じプロセス」/「別のプロセス」の明確化を入れてもらえますか?今のところ...「シェル」と「コマンドインタープリター」は同じものの単なる2つの名前なので、主な答えはそのような意味をなさないだけです。
-grawity

この答えは、物事がどのように機能するかに関する情報を提供することを除いて、実際には質問に答えません。そのため、私は実際に問題の解決策を与える答えを投稿しました。
LPChip

0

コマンドプロンプトウィンドウを起動すると、セッションが作成されます。そのプロンプトからバッチファイルを実行すると、そのセッション内でバッチファイルが起動され、そのセッションが変更されます。技術的に言えば、シェルスクリプトはそのスクリプト内で何が起こるかを理解するために別のインタープリターを必要とするため、そのスクリプトの起動時に新しいセッションが作成されるため、chdirは前のコマンドプロンプトウィンドウへのセッションから実行されません一方、.batファイルはそのコマンドプロンプトウィンドウから直接実行されますが、そうです。

やりたいことは、最初に新しいcmdプロセスを開始し、そこでバッチスクリプトを実行することです。これにより、スクリプトが現在のディレクトリに加えた変更は、異なるセッションであるため、以前のセッションに戻されません。

これを行うには、次のコマンドを実行します。

cmd /c "runscript.bat"

/ cは新しいコマンドウィンドウを開き、コマンドを実行してから、そのウィンドウを終了します。/ kを使用すると、ウィンドウが残ることを除いて同じことが行われます。つまり、基本的に現在のウィンドウが再利用されます。/ c = continueおよび/ k = killではなく、/ cが終了し、/ kが継続するというのは本当に奇妙ですが、それは単なるMicrosoft Logicです。


これは質問のどちらの部分にも答えません。シェルスクリプトについてはまったく触れておらず、現在のディレクトリがそのように機能する理由については答えていません。
-RalfFriedl

@RalfFriedlあなたの答えはすでにそれがどのように機能するかを説明しているので、私は答えのこの部分だけを追加して、それを再び説明しないようにします。しかし、実際にそこに書かれていても、それがなぜ機能するかについてもう少し理にかなって、あなたのために私の答えを編集します。
LPChip
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.