![편집하다:](https://linux55.com/image/54231/%ED%8E%B8%EC%A7%91%ED%95%98%EB%8B%A4%3A.png)
저는 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'
숨쉴 공간을 좀 주세요. 이렇게 하면 파일 시작 부분에 빈 줄이 삽입되므로 한두 가지에 의존할 수 있습니다.
다음과 같이 할 수도 있습니다.
{ echo; cat file; } |
sed '1,/^local/s/md5/trust/;1d'