Ksh 스크립트 경고 [닫기]

Ksh 스크립트 경고 [닫기]

스크립트를 실행할 때 다음 메시지가 나타납니다. 엄밀히 말하면 이후에도 실행이 계속되므로 오류가 아닙니다.

myScript -s test -u test2
pk_copylogs[2]: hist: :: not found

그런데 이 메시지가 왜 나타나는지 아시나요?

답변1

hist명령은 korn 쉘(ksh93) 내장 명령이며 bash에서는 사용할 수 없습니다.

귀하의 스크립트는 ksh가 아닌 bash에서 실행되는 것으로 보입니다.

ksh$ command -V hist
hist is a shell builtin   

bash$ command -V hist
bash: command: hist: not found

다음을 시도해 보십시오:

$ ksh myScript -s test -u test2

또는:

$ SHELL=ksh ksh myScript -s test -u test2

그러나 hist이 명령은 일반적으로 대화형 모드에서만 사용되며 스크립트에서는 사용하고 싶지 않습니다. 직접 호출되는 경우는 거의 없으며 일반적으로 다음 별칭 중 하나로 호출됩니다.

$ alias | grep hist
fc=hist
history='hist -l'
r='hist -s'        

fc, history에서 하나를 찾으세요 r.

답변2

코드 에는 myScript이름이 다른 외부 스크립트가 있습니다 pk_copylogs. pk_copylogs의 두 번째 줄에는 hist변수에 포함된 디렉터리 중 하나 등 어디에서나 액세스할 수 있는 명령이 있다고 가정해 보겠습니다 $PATH.

이 문제의 가장 가능성 있는 원인은 내가 사용한 대부분의 셸에서 바로 가기를 구성할 필요가 없었지만 나보다 앞선 사람들이 바로 가기를 구성했고 hist편의를 위해 명령이 명령으로 별칭이 지정되었기 때문입니다. history그러나 쉘 스크립트를 시작하면 별칭이 사라집니다. 물론 상황은 완전히 다를 수 있지만 참조하는 두 스크립트(예: myScript 및 pk_copylogs)의 실제 코드를 보지 않고는 어떤 주장도 하기 어렵습니다.

답변3

fc_copylogs스크립트의 두 번째 줄을 보십시오 . 이는 오류 메시지를 트리거하는 줄입니다.

다음은 수신한 것과 동일한 메시지를 재현하는 한 가지 방법입니다.

$ cd /tmp
$ cat > pk_copylogs <<%
#!/bin/ksh
fc $1
%
$ chmod +x /tmp/pk_copylogs
$ PATH=$PATH:/tmp pk_copylogs ::
pk_copylogs[2]: hist: :: not found

물론 이것은 귀하의 상황과 정확히 같지 않을 수도 있지만 확실히 매우 가깝습니다.

pk_copylogs의 두 번째 줄에는 다음 줄만 포함될 수 있습니다.

hist ::

이는 정확히 동일한 오류 메시지 또는 해당 오류 메시지로 확장되는 오류 메시지를 생성합니다.

어디를 찾아야 할지 모르는 경우 다음 명령을 실행하여 문제가 있는 스크립트를 찾을 수 있습니다.

find / -name pk_copylogs -print 

그럼 첫줄부터 보세요

head /path/to/pk_copylogs

관련 정보