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

関連情報