`test` 비교는 현재 쉘에서 스크립트를 소싱 할 때 다르게 작동합니다.

user3463406

bash 스크립트에서 놀라운 동작이 있습니다. 스크립트는 다음과 같이 최대한 단순화하려고 노력했습니다.

test.sh :

DBOK=$(sqlplus -s user/xxx as sysdba<<EOF
set feed off pages 0 echo off
SELECT decode(value,'TRUE','CLUSTER','FALSE','NONCLUSTER','UNKNOWN') from v\$parameter where name='cluster_database';
EOF
)
echo x"$DBOK"y
set -x
if [ "${DBOK}" == NONCLUSTER ]; then
echo "not a cluster do nothing"
fi
set +x

이 스크립트를 직접 실행하면 정상적으로 작동합니다.

bash ./path/test.sh

    > xNONCLUSTERy
    > ++ '[' NONCLUSTER == NONCLUSTER ']'
    > ++ echo 'not a cluster do nothing'
    > ++ set +x

하지만 스크립트를 "점 공백 슬래시"모드로 실행하면 (필요한 경우 최종 목표는 현재 프로세스의 환경을 수정하는 것입니다) 작동하지 않습니다.

. /path/test.sh

test

    xNONCLUSTERy
    ++ '[' 'NONCLUSTER' == NONCLUSTER ']'
    ++ set +x

SQL 스크립트의 결과로 변수를로드하면 제대로 작동하고 결과가 양호한 것으로 보입니다. 그러나 테스트 비교를 할 때 현재 프로세스에서 스크립트를 실행하면 손상되는 것처럼 보입니다 ???

어떤 도움을 주시면 감사하겠습니다.

Adrian의 의견에 따라 hexdump 명령으로 편집하십시오.

$ ./test.sh

00000000  4e 4f 4e 43 4c 55 53 54  45 52 0a |NONCLUSTER.| 
0000000b 
xNONCLUSTERy
++ [[ NONCLUSTER == NONCLUSTER ]]
++ echo 'not a cluster do nothing' not a cluster do nothing
++ set +x

$. ./test.sh

00000000  1b 5d 30 3b 6f 72 61 63  6c 65 40 6e 61 74 71 6f  |.]0;oracle@natqo|
00000010  72 61 30 34 3a 7e 2f 73  63 72 69 70 74 73 2f 74  |ra04:~/scripts/t|
00000020  6f 6f 6c 73 20 7c 20 73  71 6c 70 6c 75 73 20 2d  |ools | sqlplus -|
00000030  73 20 6c 65 64 62 61 40  51 42 4f 41 55 44 49 54  |s ledba@QBOAUDIT|
00000040  20 61 73 20 73 79 73 64  62 61 07 4e 4f 4e 43 4c  | as sysdba.NONCL|
00000050  55 53 54 45 52 0a                                 |USTER.|
00000056
xNONCLUSTERy
++ [[ NONCLUSTER == NONCLUSTER ]]
++ set +x
데이비드 W.

나는 당신의 기본 쉘이 bash당신이 생각하는 것과 다르다고 생각합니다. Bash 구문을 사용하고 ==있으며 일반 비 bash 테스트는 ==. 두 가지 선택 :

  • =대신 테스트로 사용하십시오 ==. 이것은 모든 Posix 기반 셸과 원래 Bourne Shell에서 작동합니다.
  • #! /bin/bash스크립트 상단에 추가 하여 다른 쉘이 아닌 Bash를 사용하고 있는지 확인하십시오. 쉘을 가정하지 마십시오. 그리고 모든 Bash를 사용 [[ ... ]]하는 경우 테스트에서 [ ... ]. 이것은 Kornshell, Dash 및 Ash 셸에서도 작동합니다.

/bin/sh가에 연결되어 있어도 /bin/bash를 통해 호출 될 때 Bash는 Bash처럼 작동하지 않습니다 sh. 대신 순수한 POSIX 모드로 작동한다고합니다. (나는 Kornshell이 ​​완전한 POSIX 호환 쉘이기 때문에 주장하고 있으며 Kornshell이 ​​수행하는 특정 작업이 작동하지 않는다는 것을 알고 있습니다 /bin/sh).

맥 OS X에서 /bin/sh연결되어 있습니다 /bin/bash. Linux 시스템에서는 /bin/shPOSIX를 더 잘 준수한다고 가정 하는 Ash 또는 Dash 셸을 사용합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

스크립트를 소싱 할 때 스크립트의 현재 디렉토리를 어떻게 참조 할 수 있습니까?

분류에서Dev

Azure SQL Server에서 스크립트를 실행할 때 오류가 발생하지만 로컬 SQL Server에서는 올바르게 작동합니다.

분류에서Dev

Azure SQL Server에서 스크립트를 실행할 때 오류가 발생하지만 로컬 SQL Server에서는 올바르게 작동합니다.

분류에서Dev

스크립트를 소싱 할 때 호출 쉘을 종료하지 않고 나머지 스크립트를 건너 뛰려면 어떻게해야합니까?

분류에서Dev

현재 디렉토리에서 스크립트를 실행할 때 "./"를 어떻게 생략합니까?

분류에서Dev

쉘 스크립트에서 .bashrc를 성공적으로 소싱 할 수 없습니다.

분류에서Dev

서비스 유틸리티를 사용할 때 서비스가 시작되지 않지만 init 스크립트를 직접 호출 할 때 작동합니다.

분류에서Dev

서비스 유틸리티를 사용할 때 서비스가 시작되지 않지만 init 스크립트를 직접 호출 할 때 작동합니다.

분류에서Dev

쉘 스크립트에서 시작할 때 redis 서버가 Ctrl + C를 무시하도록합니다.

분류에서Dev

동일한 코드가 다른 곳에서 작동 할 때 쉘 스크립트가 구문 오류를 제공하는 이유는 무엇입니까?

분류에서Dev

쉘 스크립트는 KDE와 터미널에서 다르게 작동합니다.

분류에서Dev

Jar는 쉘에서 시작할 때만 제대로 작동합니다.

분류에서Dev

HTML-스크립트는 JSFiddle에서 작동하지만 스크립트를 단독으로 실행할 때는 작동하지 않습니다.

분류에서Dev

PowerShell 스크립트에서 quser.exe를 실행하면 IDE에서 작동하지만 서비스로 실행할 때는 작동하지 않습니다.

분류에서Dev

PowerShell 스크립트에서 quser.exe를 실행하면 IDE에서 작동하지만 서비스로 실행할 때는 작동하지 않습니다.

분류에서Dev

서비스를 다시 시작할 때마다 실행할 사용자 지정 스크립트를 예약하려면 어떻게해야합니까?

분류에서Dev

현재 경로 대신 전체 경로를 사용할 때마다 '이름 바꾸기'가 다르게 작동하는 이유는 무엇입니까?

분류에서Dev

쉘 스크립트에서 다르게 동작하는`curl ifconfig.me`

분류에서Dev

노틸러스는 텍스트를 입력 할 때 이전과 다르게 작동합니다.

분류에서Dev

Powershell 스크립트는 TeamCity에서 다르게 작동합니다.

분류에서Dev

쉘 스크립트를 실행할 때 사용자에게 루트로 로그인하라는 메시지를 표시합니다.

분류에서Dev

echo $ HISTSIZE는 쉘 스크립트를 통해 실행될 때 인쇄되지 않지만 명령 줄에서 작동합니다.

분류에서Dev

Java 스크립트 코드는 본문 섹션에 배치 할 때만 작동합니다.

분류에서Dev

Python 스크립트는 우분투 서비스로 실행할 때 오류를 제공합니다.

분류에서Dev

쉘 스크립트에서 exec를 호출 할 때 왜 존재하지 않는 프로세스가 생성됩니까?

분류에서Dev

JQuery는 현재 날짜를 비교할 수 없습니다.

분류에서Dev

SSH는 스크립트에서 호출 할 때 암호를 묻습니다.

분류에서Dev

SSH는 스크립트에서 호출 할 때 암호를 묻습니다.

분류에서Dev

SSH는 스크립트에서 호출 할 때 암호를 묻습니다.

Related 관련 기사

  1. 1

    스크립트를 소싱 할 때 스크립트의 현재 디렉토리를 어떻게 참조 할 수 있습니까?

  2. 2

    Azure SQL Server에서 스크립트를 실행할 때 오류가 발생하지만 로컬 SQL Server에서는 올바르게 작동합니다.

  3. 3

    Azure SQL Server에서 스크립트를 실행할 때 오류가 발생하지만 로컬 SQL Server에서는 올바르게 작동합니다.

  4. 4

    스크립트를 소싱 할 때 호출 쉘을 종료하지 않고 나머지 스크립트를 건너 뛰려면 어떻게해야합니까?

  5. 5

    현재 디렉토리에서 스크립트를 실행할 때 "./"를 어떻게 생략합니까?

  6. 6

    쉘 스크립트에서 .bashrc를 성공적으로 소싱 할 수 없습니다.

  7. 7

    서비스 유틸리티를 사용할 때 서비스가 시작되지 않지만 init 스크립트를 직접 호출 할 때 작동합니다.

  8. 8

    서비스 유틸리티를 사용할 때 서비스가 시작되지 않지만 init 스크립트를 직접 호출 할 때 작동합니다.

  9. 9

    쉘 스크립트에서 시작할 때 redis 서버가 Ctrl + C를 무시하도록합니다.

  10. 10

    동일한 코드가 다른 곳에서 작동 할 때 쉘 스크립트가 구문 오류를 제공하는 이유는 무엇입니까?

  11. 11

    쉘 스크립트는 KDE와 터미널에서 다르게 작동합니다.

  12. 12

    Jar는 쉘에서 시작할 때만 제대로 작동합니다.

  13. 13

    HTML-스크립트는 JSFiddle에서 작동하지만 스크립트를 단독으로 실행할 때는 작동하지 않습니다.

  14. 14

    PowerShell 스크립트에서 quser.exe를 실행하면 IDE에서 작동하지만 서비스로 실행할 때는 작동하지 않습니다.

  15. 15

    PowerShell 스크립트에서 quser.exe를 실행하면 IDE에서 작동하지만 서비스로 실행할 때는 작동하지 않습니다.

  16. 16

    서비스를 다시 시작할 때마다 실행할 사용자 지정 스크립트를 예약하려면 어떻게해야합니까?

  17. 17

    현재 경로 대신 전체 경로를 사용할 때마다 '이름 바꾸기'가 다르게 작동하는 이유는 무엇입니까?

  18. 18

    쉘 스크립트에서 다르게 동작하는`curl ifconfig.me`

  19. 19

    노틸러스는 텍스트를 입력 할 때 이전과 다르게 작동합니다.

  20. 20

    Powershell 스크립트는 TeamCity에서 다르게 작동합니다.

  21. 21

    쉘 스크립트를 실행할 때 사용자에게 루트로 로그인하라는 메시지를 표시합니다.

  22. 22

    echo $ HISTSIZE는 쉘 스크립트를 통해 실행될 때 인쇄되지 않지만 명령 줄에서 작동합니다.

  23. 23

    Java 스크립트 코드는 본문 섹션에 배치 할 때만 작동합니다.

  24. 24

    Python 스크립트는 우분투 서비스로 실행할 때 오류를 제공합니다.

  25. 25

    쉘 스크립트에서 exec를 호출 할 때 왜 존재하지 않는 프로세스가 생성됩니까?

  26. 26

    JQuery는 현재 날짜를 비교할 수 없습니다.

  27. 27

    SSH는 스크립트에서 호출 할 때 암호를 묻습니다.

  28. 28

    SSH는 스크립트에서 호출 할 때 암호를 묻습니다.

  29. 29

    SSH는 스크립트에서 호출 할 때 암호를 묻습니다.

뜨겁다태그

보관