質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Tera Term

Tera Termは、TeraTerm Projectが開発する国産のWindows向けターミナルソフト。telnetプロトコルでのリモートホストへの接続やCOMポートのシリアル接続が可能で、マクロが利用できます。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

3回答

2306閲覧

Teratermマクロ シェル1の実行完了後、シェル2を実行する方法が知りたいです

Luu

総合スコア1

Tera Term

Tera Termは、TeraTerm Projectが開発する国産のWindows向けターミナルソフト。telnetプロトコルでのリモートホストへの接続やCOMポートのシリアル接続が可能で、マクロが利用できます。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2023/07/13 12:24

編集2023/07/13 12:26

実現したいこと

ttl

1sendln "シェルコマンド1.sh" 2sendln "シェルコマンド2.sh"

上記にて、シェルコマンド1.shの実行完了後にsendln "シェルコマンド2.sh"を実行したいです。

前提

Teratermマクロを用いてシェルを複数実行するマクロを作成しています。
1つのマクロの中でシェルを実行する段階で、シェル1の実行完了(終了)後、シェル2を実行させたいです。
訳合ってシェル自体の中身には手を加えることはできません。
また、本マクロを用いるにあたり、場面によってシェルの実行開始から終了までの時間が異なるため、wait を用いての待機時間指定も用いることができません。

試したこと

waitで指定メッセージが出力されたら次のシェルを動かすことを試みましたが、シェルコマンド1.shの実行完了メッセージが出力されないため出来ませんでした。
インターネット検索で調べたところシェルの実行完了メッセージはTeratermマクロのウィンドウには出力されないとのことでした...

シェルコマンド1.shの中身を変更することなく、マクロのみを用いてシェルの実行完了を待つことは不可能なのでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hqf00342

2023/07/13 13:23

waitでプロンプト文字列を待つのが普通かと思いますがそれも難しいのでしょうか? どんなプロンプトかわかりませんが$で終わるなら sendln "./1.sh" wait "$" sendln "./2.sh" 別案としては2つのスクリプトを順次実行するシェルスクリプトを1つ作り実行することだと思います。
Luu

2023/07/13 14:48

コメントありがとうございます。 wait "$"の$で終わるというのはシェルの中身のことを指すのでしょうか… $というのはどこで決めているのでしょうか。 "#"は管理者、"$"はそれ以外と誤った考えをしていました… 稚拙な質問で大変申し訳ありません。
otn

2023/07/13 14:50

シェルコマンド1.sh は、中味はバックグラウンドで実行され、本体はすぐに終了すると言うことでしょうか? であれば、中味を書いて貰わないと考えようが無いです。
otn

2023/07/13 14:52

コメントを書いてから、hqf00342さんの質問に対しての回答を見ました。 そういう回答をするということは、端末にて、 ./1.sh を実行してその後どうなるかを見たこと無いと言うことなのでしょうか? であれば、まず、実行してみましょう。
Luu

2023/07/13 15:10

@otn さん コメントありがとうございます。 おっしゃる通りです。./1.shの中身はざっと確認したのみでした。 実行はマクロの方だけでなく、Linuxウィンドウに起動コマンドを直接入力して行っているのですが、ウインドウに実行完了後何も表示されていなかったためwaitで待つ文字列がわからないと困惑しておりました。 中身を現在確認できないため、なんとも言えないのですが、"$"はシェルスクリプトの終了ステータス「$?」という認識であってますか?
otn

2023/07/13 15:35 編集

> "$"はシェルスクリプトの終了ステータス「$?」という認識であってますか? いいえ。 hqf00342さんのコメントに、「プロンプト文字列」だと書いてあるのですが、「プロンプト文字列」とう言葉を聞いたことがないでしょうか?一般的な用語なので、検索すると良いです。 > Linuxウィンドウに起動コマンドを直接入力して行っているのですが、ウインドウに実行完了後何も表示されていなかったため であれば、普通の意味では 1.sh は実行完了していません。 具体的にどういう現象を見て実行完了と判断したのでしょうか?
Luu

2023/07/13 19:16

@otn さん すみません。調べて改めて理解できました。 シェルの完了後、再び入力可能になる状態 [user@localhost〜] $ のことを指しているのですね。
hqf00342

2023/07/14 00:50

すみません、夜中に進んでいるとは思わず・・。 プロンプト文字列は > [user@localhost〜] $ で合っています。 通常はプロンプト文字列が返ってきたことをもって前のコマンドが終了したと考えます。 もし1.shの画面出力に$が含まれていたら、文字列を変えて wait "[user@localhost〜] $" 等のようにします。
otn

2023/07/14 03:45

> 具体的にどういう現象を見て実行完了と判断したのでしょうか? が重要ですね。その現象を待てば良いのですが。現象不明ではアドバイスしようがない。
Luu

2023/07/16 16:20

@hqf00342 さん ご丁寧な説明ありがとうございます。 シェルの開始終了時間をとっているログを確認したところ「wait "$" "]"」でちゃんとシェルが一つ一つ順番に実行されていました。
Luu

2023/07/16 16:34

@otn さん ログを確認していなかった当時、ウィンドウに [user@localhost〜] $ "シェルコマンド1.sh" "シェルコマンド2.sh" "シェルコマンド3.sh" [user@localhost〜] $ "シェルコマンド2.sh" [user@localhost〜] $ "シェルコマンド3.sh" のように表示されていたため、『[user@localhost〜] $ "シェルコマンド.sh"』と表示されれば実行完了と判断していました。 そして、 "シェルコマンド2.sh"  "シェルコマンド3.sh のような形で表示されていたことから、「同時にシェルが起動している(waitが機能していない)」と勝手に判断してしまいました。 お手数おかけして大変申し訳ないのですが、なぜ完了前に"シェルコマンド.sh"が連続して表示されたか教えていただけないでしょうか。
hqf00342

2023/07/17 04:10

解決したと思いますので、念のため回答を書いておきます。 上の質問ですが、正式な挙動名は知りませんが 標準入力(キー入力)をシェルコマンド1.shで受け取らなかったため、単純にシェルへの入力とみなされただけと思います。 実際には1行ずつ処理されています。 試しに"sleep 5" を実行して5秒待機の間にすばやく”echo a"とキー入力すると同じことが起きるはずです。
Luu

2023/07/17 06:16

@hqf00342 さん ご丁寧な解説、再現方法の提案ありがとうございます。
guest

回答3

0

ベストアンサー

(質問欄で解決したと思いますが書いておきます)
waitでプロンプト文字列を待つのが通常のやり方です。
例えばプロンプトが[user@localhost〜] $ の場合、

ttl

1sendln "./1.sh" 2wait "$" 3sendln "./2.sh"

のようにします。
NW機器はLinuxのようにスクリプトを書けないのでTeraterm使っているSE/インフラエンジニアではよく使われます。

投稿2023/07/17 03:52

hqf00342

総合スコア394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

非同期の処理でなければ1.sh、2.shを両方記載しておけば記載したシェルが終わるのをまって次のシェルが実行されます

投稿2023/07/14 03:03

yambejp

総合スコア117615

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コードがあるので、回答欄に書きます。

なぜ完了前に"シェルコマンド.sh"が連続して表示されたか教えていただけないでしょうか。

コマンド実行中にキーインすると、その場でエコーバックされて、さらにプロンプトが出た後に再度エコーされるというのは、下記の通りです。

コマンド実行中でも、キーイン自体は可能なので、その場でエコーバックされるのは自然です。

プロンプトの後で再度表示されるのはシェルが意図的にやっています。
BashやZshでなく、dash というシンプルなシェルを使ってみると、プロンプト後の再表示は無いです。

sendln "sleep 1; date"を4回繰り返すTTLファイルを実行すると、

Dash

1$ sleep 1; date 2sleep 1; date 3sleep 1; date 4sleep 1; date 5Mon Jul 17 15:50:10 JST 2023 6$ Mon Jul 17 15:50:11 JST 2023 7$ Mon Jul 17 15:50:12 JST 2023 8$ Mon Jul 17 15:50:13 JST 2023 9$

Bash

1$ sleep 1; date 2sleep 1; date 3sleep 1; date 4sleep 1; date 5Mon Jul 17 15:51:41 JST 2023 6$ sleep 1; date 7Mon Jul 17 15:51:42 JST 2023 8$ sleep 1; date 9Mon Jul 17 15:51:43 JST 2023 10$ sleep 1; date 11Mon Jul 17 15:51:44 JST 2023 12$

dateを止めて、sendln "sleep 1"にすると、こんな感じ。

Dash

1$ sleep 1 2sleep 1 3sleep 1 4sleep 1 5$ $ $ $

「同時にシェルが起動している(waitが機能していない)」と勝手に判断してしまいました。

質問の際には主観を書いてはいけないことはないのですが(自分がどう考えたかも大事なので主観も書いた方が良い)、主観だけでなく客観的事実を書いた上で主観を書く(あるいは客観だけ書く)とやりとりが減って、早く解決します。コメント1往復で1日掛かったりしますからね。
特に主観を客観のごとく書くと、回答者が混乱します。

投稿2023/07/17 07:01

編集2023/07/17 07:08
otn

総合スコア86281

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問