編集する:

編集する:

私は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

私が試したこと:

  1. sed電話をかけるにはフルパスを使用してください。結果は同じです。まだ他の製品を使っているようですがsed
  2. に電話してみてくださいbash -l。結果は同じです。
  3. 別のコマンドを宣言しようとしました。S=/usr/lib/sed$S結果は同じです。
  4. PATHを確認してください。 cmdとスクリプトの両方が/usr/bin含まれています。
  5. 二重引用符を一重引用符に置き換えてください。結果は同じです。
  6. -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質問は私をくすぐります!

編集する:

今回は注文が少し入ってほしい...

  1. ログインシェルパス=/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
  2. スクリプトのパス=
    /usr/sbin:/usr/bin:/usr/local/ctera/apache-ant-1.8.2/bin:/usr/local/ctera/apache-ant-1.8.2/bin
  3. PATH=$(command -p getconf PATH):$PATHPATH = 呼び出し時にスクリプトに存在する/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
  4. truss -f sedログインシェルから呼び出された/usr/bin/sed
  5. truss -f sedスクリプトから呼び出された/usr/sun/bin/sed
  6. truss -f /usr/bin/sedスクリプトから呼び出されます/usr/sun/bin/sed! ! !
  7. 設定後PATH=$(command -p getconf PATH):$PATH
    7.1truss -f sedスクリプト呼び出しで/usr/xpg4/bin/sed
    7.2truss -f /usr/bin/sedスクリプト呼び出しで/usr/sun/bin/sed

追加情報:

コマンド出力:(シェルプロンプトとスクリプト内で実行)

  1. 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

  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

  3. 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

  4. 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

  5. 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/binNexentaのデフォルトの動作は、背中にインストールされている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には付属していません)。;}sedsed

ポータブル/標準:

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'

bashSolarisやLinux(またはksh(またはSolaris)などのPOSIXシェルで)POSIX互換ユーティリティを入手するには、次のように/usr/xpg4/bin/sh追加できます。

PATH=$(command -p getconf PATH):$PATH

スクリプトの上部に移動します。または、command -pPOSIXバージョンを必要な各コマンドの前に追加してください。

答え3

別のポータブル方法は次のとおりですsed

sed 1i\\ file |
sed '1,/^local/s/md5/trust/;1d'

息をのむようにしてください。これにより、ファイルの先頭に空白行が挿入されるため、1つまたは2つに依存することができます。

次のようにすることもできます。

{ echo; cat file; } |
sed '1,/^local/s/md5/trust/;1d'

関連情報