HP-UX/perl4 で作成したスクリプトを、Linux(Red Hat)/perl5 へ移植するに当たって、system関数の動作が異なり困っています。
HP-UX では ksh をシェルとして使用していたため、perl からのsysytem関数で実行するsystemコマンドも、kshで動作するものを使っていました。Linuxでもログインシェルをkshに設定しました。
ところが、HP-UXで使っていたprintコマンドが使用できず、以下のエラーメッセージが出ます。
sh: print: command not found
シェルはkshを指定していても、perlからsystem関数やバッククウォート`` でシステムコマンドを実行するときは、shが使われるようなのです。
perl内の記述は以下のとおりです。
system("print 'a'");
"print"の前に"ksh "をつけたり、"print"を"echo"に変えると、正しく動作します。
移植するperlの本数が多いのと、print以外にもこの問題が起きるかもしれませんので、できれば perl 内からのシステムコマンド実行時にもログインシェルとおなじ ksh で動くようにしたいのですが、どのようにすればよいのでしょうか?
よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
perl の system コマンドは、基本的に、プログラムを直接起動します。
リダイレクトなどシェルが必要な構文が使われている場合には、/bin/sh を通しますが、どちらにせよ、ログインシェルである ksh が呼び出されることはありません。
( system("echo 'a'"); が動作するのは、/bin/sh の内部コマンドとは別に、/bin/echo がインストールされているからです)
そのため、ksh の内部コマンドを system 経由で直接利用することはできません。
HP-UX環境では、外部コマンドとしてプログラム「print」がインストールされているのではないでしょうか。(もしくは、/bin/sh が ksh になっているとか)
Linux 環境でも、同様動作をする「print」プログラムをインストールすれば、perlスクリプトは改変しなくても動作させられるように出来ると思います。
おそらく
---
#!/usr/local/bin/ksh
print $*
---
といった2行のシェルスクリプトでいけるんじゃないでしょうか。
分かりやすいご回答、ありがとうございます。
HP-UX で、(/usr/bin/sh print "a")とすると動きましたが、
Linuxでは動きませんでした。
printはパスが通っているところにありませんでしたので、
HP-UXでも外部コマンドとしてインストールされているのではないようでして、おっしゃられるように、/bin/sh が ksh になっているといった理由のようです。
お示しいただいた print プログラムを作ることで、解決できました。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux Linuxについて質問です。 以下のhistoryの出力結果から、sedコマンドのファイル名tmp1 1 2023/02/03 20:11
- その他(プログラミング・Web制作) Pythonの作業環境・作業フォルダの迅速な設定・指定方法 3 2022/04/01 07:55
- その他(プログラミング・Web制作) awkのtoupper() 1 2022/10/21 20:39
- その他(プログラミング・Web制作) Linuxについて質問です。 引数に指定されたアクセスログのファイルからアクセス数が多い順に上位3つ 1 2023/02/03 03:46
- UNIX・Linux cronの@rebootでのdateコマンドの実行につきまして 2 2023/06/11 16:23
- CGI -T(汚染モード)でメールが送れません 1 2022/06/12 14:11
- Perl perlでリテラル値はメモリにどのように格納されているか? 1 2023/01/15 20:45
- UNIX・Linux Linuxのシェル関数を作成して要件を満たす方法 1 2022/11/19 20:33
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- その他(プログラミング・Web制作) pythonのmap、結果の利用は1度だけ? 5 2022/06/11 12:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックスラッシュの意味がわか...
-
export と set は違うの?
-
msys(cygwin)で、シェルスクリ...
-
Cシェル内でBシェルの様な関数...
-
シェルの変数をMySQLに送る方法...
-
Solarisでデフォルト環境変数の...
-
違いについて
-
ターミナルが全く入力できない
-
正規表現とワイルドカード
-
lsコマンド部分一致方法
-
シェルとシェルの間で環境変数...
-
.cshrc ファイルについて
-
Dirコマンドでフォルダ内ファイ...
-
TOPコマンドで表示するCPU使用...
-
エクセルの表にヘンな枠が・・・
-
スクリプトのエラー「unexpecte...
-
UNIX コマンドにおける # や円...
-
iqoo neo 9と言うスマホがある...
-
コマンドプロンプトから別マシ...
-
pingは正常なのにtracerouteで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Cシェル内でBシェルの様な関数...
-
export と set は違うの?
-
ターミナルが全く入力できない
-
ubuntuの端末の左にカレントデ...
-
シェルスクリプトで #!/bin/sh ...
-
.cshrc ファイルについて
-
バックスラッシュの意味がわか...
-
シェル 会話形式でエンターキ...
-
『存在するかどうか分からない...
-
シェルスクリプトに関する問題...
-
lsコマンド部分一致方法
-
シェルスクリプトのbashとperl...
-
シェル(ksh)で変数にある文字列...
-
mac os x10.6.4のターミナルでp...
-
Linuxのファイル禁止文字
-
Solarisでデフォルト環境変数の...
-
ps -aのセッションリーダとは
-
csh (tcsh)での環境変数の長さ...
-
Cシェルでのファイルからの入...
-
tcshなのにスクリプト構文中のs...
おすすめ情報