awk에서 쉘 명령을 실행하는 방법

awk에서 쉘 명령을 실행하는 방법

아래와 같이 디렉터리를 A 경로에서 B 경로로 변경하려고 합니다.

pwd|awk '{if($1=="/") cd /tmp/}'
awk: syntax error near line 1
awk: illegal statement near line 1

제안해주세요

답변1

system()in을 사용하여 모든 명령을 실행할 수 있지만 awk하위 쉘에서 명령을 실행하기 때문에 디렉토리를 변경하는 데 사용할 수 없습니다. 따라서 하위 쉘에서 디렉토리를 변경하면 하위 쉘이 즉시 종료됩니다. 명령은 다음과 같습니다.

pwd|awk '$0 == "/"{system("cd /tmp")}'

하지만 내가 말했듯이 이것은 작동하지 않습니다. 명령 앞에 다음을 추가 하면 echo예상한 대로 실제로 실행되는 것을 볼 수 있습니다 .

$ cd /
$ pwd|awk '$0 == "/"{system("echo cd /tmp")}'
cd /tmp
$ cd /home
$ pwd|awk '$0 == "/"{system("echo cd /tmp")}'

나는 그냥 사용하고 if선언하는 것이 더 낫다고 생각합니다.

if [ "${PWD}" = '/' ];then 
  cd /tmp
fi

답변2

cd내부에서 호출하는 awk것은 가능하지만( 명령을 호출 system()하지 않고 사용 ) 많은 작업을 수행하지는 않습니다. 특히, 시작된 쉘의 현재 작업 디렉토리는 변경되지 않습니다 . 작업 디렉터리는 환경에 대해 로컬이며 다른 프로세스나 하위 셸은 상위 프로세스에서 상속된 자체 환경에서 실행됩니다(그리고 상위 프로세스의 환경은 하위 프로세스에서 변경할 수 없습니다).awkcdawkawk

cd현재 디렉터리가 루트인지, 루트 디렉터리 인지 확인하려면 /tmp셸에서 직접 다음을 수행할 수 있습니다.

[ "$PWD" = "/" ] && cd /tmp

관련 정보