web-dev-qa-db-ja.com

awk内でシェルコマンドを実行する方法

以下のようにAパスからBパスにdirを変更しようとしています

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

提案してください

2
Anavarathan

cd内からawkを呼び出すことは可能です(system()を使用すると、awkと呼ばれるcdコマンドはありません)が、あまりしません。特に、awkを開始したシェルの現在の作業ディレクトリは変更されません。作業ディレクトリは環境に対してローカルであり、awkおよびその他のプロセスまたはサブシェルは、親プロセスから継承された独自の環境で実行されます(親プロセスの環境を子プロセスから変更することはできません)。 )。

現在のディレクトリがルートディレクトリであるかどうかを確認し、ルートディレクトリである場合はcdから/tmpを確認したい場合は、シェルで直接確認できます。

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

awksystem()を使用して任意のコマンドを実行できますが、サブシェルでコマンドを実行するため、ディレクトリを変更するために使用することはできません。そのため、サブシェルのディレクトリを変更します。すぐに終了します。コマンドは次のようになります。

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
3