私は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ツールが必要な場合は、スクリプトでそれを無効にできます。
答え2
いずれにせよ、
sed "0,/^local/{s/md5/trust/}"
GNUに固有であり(0
以前のアドレスと欠落している部分)、他の実装では使用できません(SolarisはデフォルトではGNUには付属していません)。;
}
sed
sed
ポータブル/標準:
sed '/^local/,$!s/md5/trust/'
で始まる最初の行までのみ置き換えます(含まない)local
。または:
awk 'NR == 1, /^local/ {gsub(/md5/,"trust")}; {print}'
(Solarisではこれが必要な場合がありますcommand -p awk
。)
最初の一致する行を置き換えるには、次の手順を実行します/^local/
。
awk '/^local/ && ! seen {gsub(/md5/, "trust"); seen = 1}; {print}'
または:
sed -e '/^local/!b' -e 's/md5/trust/g;:1' -e 'n;b1'
bash
SolarisやLinux(またはksh
(またはSolaris)などのPOSIXシェルで)POSIX互換ユーティリティを入手するには、次のように/usr/xpg4/bin/sh
追加できます。
PATH=$(command -p getconf PATH):$PATH
スクリプトの上部に移動します。または、command -p
POSIXバージョンを必要な各コマンドの前に追加してください。
答え3
別のポータブル方法は次のとおりですsed
。
sed 1i\\ file |
sed '1,/^local/s/md5/trust/;1d'
息をのむようにしてください。これにより、ファイルの先頭に空白行が挿入されるため、1つまたは2つに依存することができます。
次のようにすることもできます。
{ echo; cat file; } |
sed '1,/^local/s/md5/trust/;1d'