私はLinuxとSolaris(Nexenta)用のスクリプトを使用しています。
この行はLinuxでは機能しますが、Solarisでは機能しません(ただし、シェルで実行している場合は機能します)。
cat "pg_hba.conf" | sed "0,/^local/{s/md5/trust/}"
エラーメッセージは次のとおりです。
sed: command garbled: 0,/^local/{s/md5/trust/}
sed
ちょっとした調査の後、私はbashがスクリプトで別々に使用されていることを発見しました。
シェルから:/usr/bin/sed
スクリプトから:/usr/sun/bin/sed
スクリプトを使いたいです/usr/bin/sed
。
私が試したこと:
sed
電話をかけるにはフルパスを使用してください。結果は同じです。まだ他の製品を使っているようですがsed
…- に電話してみてください
bash -l
。結果は同じです。 - 別のコマンドを宣言しようとしました。
S=/usr/lib/sed
。$S
結果は同じです。 - PATHを確認してください。 cmdとスクリプトの両方が
/usr/bin
含まれています。 - 二重引用符を一重引用符に置き換えてください。結果は同じです。
-rフラグを使用してsedを実行してみてください。出力は次のとおりです
# /usr/xpg4/bin/sed -r /usr/xpg4/bin/sed: illegal option -- r Usage: sed [-n] script [file...] sed [-n] [-e script]...[-f script_file]...[file...]
助ける? ?
私がしなければならないのは、「local」で始まる最初の行で最初に表示される「md5」を「trust」に置き換えることです。私はこれができることを知っていますが、このsed
質問は私をくすぐります!
編集する:
今回は注文が少し入ってほしい...
- ログインシェルパス=
/usr/local/ctera/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/ctera/apache-ant-1.8.2/bin
- スクリプトのパス=
/usr/sbin:/usr/bin:/usr/local/ctera/apache-ant-1.8.2/bin:/usr/local/ctera/apache-ant-1.8.2/bin
PATH=$(command -p getconf PATH):$PATH
PATH = 呼び出し時にスクリプトに存在する/usr/xpg4/bin:/usr/ccs/bin:/usr/bin:/opt/SUNWspro/bin:/usr/xpg4/bin:/usr/ccs/bin:/usr/bin:/opt/SUNWspro/bin:/usr/sbin:/usr/bin:/usr/local/ctera/apache-ant-1.8.2/bin:/usr/local/ctera/apache-ant-1.8.2/bin
truss -f sed
ログインシェルから呼び出された/usr/bin/sed
truss -f sed
スクリプトから呼び出された/usr/sun/bin/sed
truss -f /usr/bin/sed
スクリプトから呼び出されます/usr/sun/bin/sed
! ! !- 設定後
PATH=$(command -p getconf PATH):$PATH
:
7.1truss -f sed
スクリプト呼び出しで/usr/xpg4/bin/sed
7.2truss -f /usr/bin/sed
スクリプト呼び出しで/usr/sun/bin/sed
!
追加情報:
コマンド出力:(シェルプロンプトとスクリプト内で実行)
truss -ft execve /usr/bin/sed q
シェルコマンドで:
8604: execve("/usr/bin/sed", 0x08047D20, 0x08047D2C) argc = 2
スクリプトから:
8545: execve("/usr/sun/bin/sed", 0x08047768, 0x08047774) argc = 2
file /usr/bin/sed
シェルコマンドで:
/usr/bin/sed: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), stripped
スクリプトから:
file: /usr/bin/sed zero size or zero entry ELF section - ELF capabilities ignored file: /usr/bin/sed: can't read ELF header /usr/bin/sed: data
ls -l /usr/bin/sed
シェルコマンドで:
-rwxr-xr-x 1 root root 96440 May 31 2008 /usr/bin/sed
スクリプトから:
-rwxr-xr-x 1 root root 96440 May 31 2008 /usr/bin/sed
ls -ld $(type -pa sed)
シェルコマンドで:
-rwxr-xr-x 1 root root 96440 May 31 2008 /bin/sed -rwxr-xr-x 1 root root 96440 May 31 2008 /usr/bin/sed
スクリプトから:
-rwxr-xr-x 1 root root 96440 May 31 2008 /usr/bin/sed
md5sum $(type -pa sed)
シェルコマンドで:
385361c5111226c8eac8e25b53fed29c /bin/sed 385361c5111226c8eac8e25b53fed29c /usr/bin/sed
スクリプトから:
385361c5111226c8eac8e25b53fed29c /usr/bin/sed
このスクリプトはJAVAコードで呼び出されます。
uname -a
SunOS cteraportal 5.11 NexentaOS_134f i86pc i386 i86pc Solaris
sed
マイコンピュータのバージョンに関する情報が追加されることがあります。~# ll `find / -name sed` -rwxr-xr-x 1 root root 96440 May 31 2008 /usr/bin/sed -r-xr-xr-x 1 root bin 35656 Sep 7 2010 /usr/sun/bin/sed -r-xr-xr-x 1 root bin 32104 Sep 7 2010 /usr/ucb/sed -r-xr-xr-x 1 root bin 35636 Sep 7 2010 /usr/xpg4/bin/sed /usr/share/doc/sed: total 113 -rw-r--r-- 1 root root 168 Jun 21 2005 AUTHORS.gz -rw-r--r-- 1 root root 2507 Jun 21 2005 BUGS.gz -rw-r--r-- 1 root root 6584 Feb 3 2006 NEWS.gz -rw-r--r-- 1 root root 285 Jun 21 2005 README.gz -rw-r--r-- 1 root root 1071 Jan 12 2006 THANKS.gz -rw-r--r-- 1 root root 4806 May 31 2008 changelog.Debian.gz -rw-r--r-- 1 root root 32312 Feb 3 2006 changelog.gz -rw-r--r-- 1 root root 796 May 31 2008 copyright drwxr-xr-x 2 root root 3 May 30 2011 examples drwxr-xr-x 2 root root 3 May 30 2011 sed-4.1.5 -rw-r--r-- 1 root root 56538 May 31 2008 sedfaq.txt.gz
ベストアンサー1
わかりました。見つけました。今これは意味があります。
この動作は Nexenta に固有のもので、次に説明します。http://lwn.net/Articles/334756/
GNUの代わりにGNU
/usr/bin
Nexentaのデフォルトの動作は、背中にインストールされているGNUユーティリティを好むことです/usr/sbin
。これらのユーティリティのSunバージョン/usr/sun/bin
はにインストールされています/usr/sun/sbin
。 Nexentaは、GNUとSUNの属性を切り替えるためのトリックを使用しています。環境変数SUN_PERSONALITYが1に設定されている場合、ユーザーが明示的に絶対パス(たとえば)を介してコマンドを実行しても、検索パスが優先されます/usr/sun/bin
。これにより、Solaris ベースのスクリプトを変更せずに Nexenta で実行できます。 NexentaはSVR4パッケージコマンドでもこの機能を使用します。 SVR4形式のネイティブSolarisパッケージをインストールするために使用でき、Alienを呼び出してパッケージをすぐにDebianパッケージに変換できます。/usr/sun/sbin
/usr/bin/sed
これはlibcのどこかで行われます。
だから、
$ sed --version
GNU sed version 4.1.5
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.
$ SUN_PERSONALITY=1 sed --version
sed: illegal option -- version
したがって、Javaで始まるスクリプトはSUN_PERSONALITYを設定する必要があります。
GNUツールが必要な場合は、スクリプトでそれを無効にできます。