2

改行文字は、server2 (Solaris) では正しく認識されますがbackslashn、server1 (Linux) では文字として認識されます。これを修正するにはどうすればよいですか?

引数を受け取ってメールを送信する単純なスクリプトに取り組んでいるときに、このかなり奇妙な動作に最初に気付きました..

構文:$ ksh SEND_MAIL.sh <to> <Subject> <body>

  1. そのスクリプトをserver-1で実行すると

    [kent@server1] $ ksh SEND_MAIL.sh name@site.com "Subject" "123\n456" [Thu Jan 10 10:51:18 EST 2013] - name@site.com にメールを送信し始めました。件名 \'>>>123\n456\'

    改行文字はバックラッシュ-n と見なされることに注意してください。

  2. server-2 では、\n特殊文字が正しく改行文字に展開されます。

    [kent@server2] $ ksh SEND_MAIL.sh name@site.com "Subject" "123\n456" [Thu Jan 10 10:51:18 EST 2013] - name@site.com にメールを送信し始めました。件名 \'>>>123 456\'

いくつかの KornShell 環境変数を変更する必要があると思いますが、それがわかりません。

アップデート:

以下のヘンクのガイダンスの後...違いを知るだけでは、主な問題を解決するのに十分ではないことがわかりました-つまり、server1のスクリプトに\n文字を改行として認識させることです。だから私は私の質問を改善しました。


ノート:

Server1 は Linux サーバーで、Server2 は Solaris です。


環境の詳細 > KornShell: - Henk Langeveldの提案による

server1:

[kent@server1]$ ksh --version
  version         sh (AT&T Research) 93t+ 2010-02-02
[kent@server1]$ echo ${.sh.version}
bash: ${.sh.version}: bad substitution
[kent@server1]$ [ "${ERRNO}" ] && echo ksh88 || echo ksh93
ksh93
[kent@server1]$ [ "`echo "\c" | grep c`" ] && echo ksh93 || echo ksh88 
ksh93

server2:

# I'm am in bash
[kent@server2]$ ksh --version 
$
$ ksh --version
$ 
[kent@server2]$ echo ${.sh.version}
bash: ${.sh.version}: bad substitution
[kent@server2]$ [ "${ERRNO}" ] && echo ksh88 || echo ksh93
ksh93
[kent@server2]$ [ "`echo "\c" | grep c`" ] && echo ksh93 || echo ksh88 
ksh93

サーバー 1 と 2 では、同じ動作が得られます。

$ echo -e "1\n2"
1
2
$ echo "1\n2"
1\n2
$ echo $'1\n2'
1
2

コード:

SEND_MAIL.sh

#Syntax: $ ksh SEND_MAIL.sh <to> <Subject> <body>
TO_REC=$1
SUBJECT=$2
MESSAGE=$3
echo "$MESSAGE"| mailx -s "$SUBJECT" $TO_REC

オリバーが以下で提案したようset | grep SHに、両方のサーバーのスクリプトに行を入れて、実行されているシェルを確認します。

server1:

[kent@server1]$ ksh SEND_MAIL.sh kent@123.com "Subject" ">>>123\n\n456$a"
KSH_VERSION=.sh.version
SHELL=/bin/bash
SHLVL=3
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SSH_CLIENT='3.209.100.144 59645 22'
SSH_CONNECTION='3.209.100.144 59645 3.56.9.127 22'
SSH_TTY=/dev/pts/1
...

server2:

[kent@server2]$ ksh SEND_MAIL.sh kent@123.com "Subject" ">123\n\n456$a"
SHELL=/bin/ksh
SHLVL=1
SSH_CLIENT='3.209.100.144 49351 22'
SSH_CONNECTION='3.209.100.144 49351 3.56.29.159 22'
SSH_TTY=/dev/pts/2
...
4

4 に答える 4

2

2 つのサーバーには異なるkshバイナリがあります。サーバー 1 は、ほとんどの Linux システム (debian および EL 派生物) にバンドルされている AT&T の最新の ksh93 です。サーバー 2 は一匹狼です。おそらくそれpdkshですか?これは、あなたが見ている違いを説明しています。

server1:

[kent@server1]$ ksh --version
  version         sh (AT&T Research) 93t+ 2010-02-02

server2:

# I'm am in bash
[kent@server2]$ ksh --version 
$
于 2013-01-11T08:47:35.037 に答える
2

これは AST ksh93、pdksh、または古い ksh88 ですか?

kshの出力ksh --versionと値を確認して、バージョンを確認する方法は次のとおりです。${.sh.version}

$ ksh --version
version         sh (AT&T Research) 93u+ 2012-06-26
$ ksh -c 'echo ${.sh.version}'
Version AJM 93u+ 2012-06-26

次に、2 つのサーバーで結果が同じかどうかをお知らせください。古いバージョンの ksh では、実際にはエラーが報告される場合があります。


ksh93 のソリューション:

server1 で、 \n を ksh93 に埋め込み、andAnsi stringで囲みます。$''

two_lines=$'one\ntwo'  && print "$two_lines"
one
two

これにより、C スタイルのエスケープが推定されます。

于 2013-01-11T00:30:24.787 に答える
2

各サーバーで次を参照してください。

  • ksh のバージョン
  • 試行時にログインしたシェル:grep kent /etc/passwd最後のフィールドにログインシェルが表示されます)。
  • そして、head -n 1 /path/to/SEND_MAIL.shどちらかが別の「シバン」をスポーツしているかどうかを確認するために a を実行します。
  • そして最後に、その行set | grep SHを別のスクリプトに入れて、たとえば./test.sh、次にchmod +x ./test.sh、実行します : ./test.sh: 各サーバーで異なるシェルで実行されるかどうかを確認します
于 2013-01-10T18:45:59.050 に答える
0

Linux の korn シェルの場合は、echo の代わりに print または printf を試してください。それは私にとってはうまくいきます。現在、スクリプトを AIX から Linux に移植するために使用しています。考えられるすべてのコンテキストをテストしたわけではありませんが、これまでのところうまく機能しています。これより前に試した別のオプションも機能します。これは次のとおりです。

.profile などの環境設定ファイルに、次のステートメントを追加します。

次に、すべての \n を ${NL} に置き換えます。$NL に続くものを環境変数名の一部として扱いたくないため、中括弧が必要です。

幸運を

于 2015-03-24T16:32:07.320 に答える