악어의 목에 달렸을 때, 목표는 늪을 배수하는 것임을 잊기 쉽습니다.
— 인기있는 말
문제는에 관한 echo
것이지만 지금까지 대부분의 답변은 set +x
명령 을 몰래 넣는 방법에 중점을 두었 습니다. 훨씬 간단하고 직접적인 해결책이 있습니다.
{ echo "Message"; } 2> /dev/null
(나는 { …; } 2> /dev/null
이전 답변에서 그것을 보지 못했다면 생각하지 않았을 수도 있음을 인정합니다 .)
이 작업은 다소 번거롭지 만 연속 된 echo
명령 블록이있는 경우 각 명령을 개별적으로 수행 할 필요가 없습니다.
{
echo "The quick brown fox"
echo "jumps over the lazy dog."
} 2> /dev/null
줄 바꿈이있을 때는 세미콜론이 필요하지 않습니다.
비표준 파일 디스크립터 (예 : 3)를 영구적으로
열고 항상 대신 말하는 kenorb의 아이디어 를 사용하여 입력 부담을 줄일 수 있습니다 ./dev/null
2>&3
2> /dev/null
이 글을 쓰는 시점에서 처음 네 대답은 (대부분의 경우, 성가신에, 등) 뭔가 특별한 일을 필요로
모든 당신이 할 시간 echo
. 모든 echo
명령이 실행 추적을 억제하기 를 정말로 원한다면 (그리고 왜 그렇지 않을까요?) 많은 코드를 문지르지 않고도 전체적으로 그렇게 할 수 있습니다. 먼저 별칭이 추적되지 않는 것으로 나타났습니다.
$ myfunc()
> {
> date
> }
$ alias myalias="date"
$ set -x
$ date
+ date
Mon, Oct 31, 2016 0:00:00 AM # Happy Halloween!
$ myfunc
+ myfunc # Note that function call is traced.
+ date
Mon, Oct 31, 2016 0:00:01 AM
$ myalias
+ date # Note that it doesn’t say + myalias
Mon, Oct 31, 2016 0:00:02 AM
(다음 스크립트 스 니펫 은 bash에 대한 링크 인 #!/bin/sh
경우에도 shebang이 작동하면 작동 /bin/sh
하지만 shebang이 #!/bin/bash
인 경우 shopt -s expand_aliases
스크립트에서 별명이 작동하도록 명령을 추가해야합니다 .)
그래서 첫 번째 트릭은 다음과 같습니다.
alias echo='{ set +x; } 2> /dev/null; builtin echo'
이제 우리가 말할 때 echo "Message"
추적되지 않는 별칭을 호출합니다. 별명은 추적 옵션을 끄고 set
명령 에서 추적 메시지를 억제하고 ( user5071535의 answer 에서 처음 제시된 기술 사용 ) 실제 echo
명령 을 실행합니다 . 이를 통해 모든 echo
명령 에서 코드를 편집 할 필요없이 user5071535의 답변과 유사한 효과를 얻을 수 있습니다 . 그러나 이렇게하면 추적 모드가 해제됩니다. set -x
별칭은 문자열을 단어로만 대체 할 수 있기 때문에 별칭에 (또는 최소한 쉽지 는 않습니다) 넣을 수 없습니다 . 인수 뒤에 별칭 문자열의 어떤 부분도 명령에 삽입 할 수 없습니다
(예 :) "Message"
. 예를 들어 스크립트에
date
echo "The quick brown fox"
echo "jumps over the lazy dog."
date
출력은
+ date
Mon, Oct 31, 2016 0:00:03 AM
The quick brown fox
jumps over the lazy dog.
Mon, Oct 31, 2016 0:00:04 AM # Note that it doesn’t say + date
따라서 메시지를 표시 한 후에도 추적 옵션을 다시 설정해야하지만 연속 된 모든 명령 블록 마다 한 번 씩만 echo
수행해야합니다.
date
echo "The quick brown fox"
echo "jumps over the lazy dog."
set -x
date
우리가 set -x
자동으로 할 수 있다면 더 좋을 것echo
입니다. 그러나 그것을 제시하기 전에 이것을 고려하십시오. OP는 #!/bin/sh -ex
shebang 을 사용하는 스크립트로 시작 합니다. 암시 적으로 사용자 x
는 shebang에서를 제거하고 실행 추적없이 정상적으로 작동하는 스크립트를 가질 수 있습니다. 해당 속성을 유지하는 솔루션을 개발할 수 있다면 좋을 것입니다. 여기의 처음 몇 가지 대답은 속성 echo
이 이미 켜져 있는지 여부에 관계없이 after 문을 무조건적 으로 추적하기 때문에 해당 속성에 실패합니다 .
이 답변은 눈에 띄게 그것으로, 그 문제를 인식하지 못합니다 대체 echo
추적 출력으로 출력; 따라서 추적이 해제되면 모든 메시지가 사라집니다. 이제 echo
문장이 끝난 후에 만 조건부로 추적을 다시 켜는 솔루션을 제시하겠습니다 . 무조건 추적을 "뒤로"돌리는 솔루션으로 이것을 다운 그레이드하는 것은 쉽지 않으며 연습으로 남겨집니다.
alias echo='{ save_flags="$-"; set +x;} 2> /dev/null; echo_and_restore'
echo_and_restore() {
builtin echo "$*"
case "$save_flags" in
(*x*) set -x
esac
}
$-
옵션 목록입니다. 설정된 모든 옵션에 해당하는 문자의 연결. 예를 들어, e
및 x
옵션이 설정되어, 다음 $-
포함 문자의 뒤범벅이 될 것입니다 e
및 x
. 위의 새 별칭은 $-
추적 기능을 끄기 전에 의 값을 저장합니다 . 그런 다음 추적을 끄면 제어를 쉘 기능으로 넘깁니다. 이 함수는 실제 작업 echo
을 수행 한 다음 x
별명이 호출 될 때 옵션이 켜져 있는지 확인합니다 . 옵션이 켜져 있으면 기능이 다시 켜집니다. 꺼져 있으면 기능이 꺼져 있습니다.
shopt
스크립트 시작 부분에 위의 7 줄 (을 포함하면 8 개)을 삽입 하고 나머지는 그대로 둡니다.
이것은 당신을 허용 할 것입니다
- 다음 shebang 라인 중 하나를 사용하십시오.
#! / bin / sh -ex
#! / bin / sh -e
#! / bin / sh –x
아니면 그냥 평범한#! / bin / sh
예상대로 작동합니다.
- 같은 코드를 가지고
(shebang)
명령 1
명령 2
명령 3
세트 -x
명령 4
명령 5
명령 6
+ x 설정
명령 7
명령 8
명령 9
과
- 명령 4, 5 및 6은 추적됩니다. 명령 중 하나가이 아닌
echo
경우에는 실행되지만 추적되지는 않습니다. (그러나 명령 5가 echo
이지만 명령 6은 여전히 추적됩니다.)
- 명령 7, 8 및 9는 추적되지 않습니다. 명령 8이
echo
이지만 명령 9는 여전히 추적되지 않습니다.
- 명령 1, 2 및 3은 shebang의 포함 여부에 따라 추적 (4, 5 및 6과 같은) 또는 7, 7, 8 및 9와 같은 추적되지 않습니다
x
.
추신 : 나는 내 시스템에서 builtin
키워드를 중간 답변 (의 별명 인 키워드)에서 제외 할 수 있음을 발견했습니다 echo
. 이것은 놀라운 일이 아닙니다. bash (1)은 별칭 확장 중에…
… 확장중인 별칭과 동일한 단어는 두 번 확장되지 않습니다. 이것은 예를 들어 별칭 ls
을 지정할 수 ls -F
있으며 bash는 대체 텍스트를 재귀 적으로 확장하려고 시도하지 않습니다.
너무 놀라운 일이 마지막 대답 (로 한 echo_and_restore
경우 생성)에 실패 builtin
키워드가 생략 1 . 그러나 이상을 삭제 builtin
하고 순서를 전환 하면 이상하게 작동합니다 .
echo_and_restore() {
echo "$*"
case "$save_flags" in
(*x*) set -x
esac
}
alias echo='{ save_flags="$-"; set +x;} 2> /dev/null; echo_and_restore'
__________
1 정의되지 않은 행동을 일으키는 것 같습니다. 나는 본 적이
- 무한 루프 (아마도 무한한 재귀로 인해)
/dev/null: Bad address
오류 메시지 및
- 코어 덤프.
echo +x; echo "$*"; echo -x
별칭으로 동등한 방법을 제시 할 수 있다면 그것을보고 싶습니다.