Shellのメモ

shell芸人への道
memo
shell
Author

Masaya Kameyama

Published

February 20, 2024

xargsを使ってコマンドを実行後ファイルを書き出す

パイプ(|)とリダイレクト(>)

次のような形でlsで表示したファイルを全てcurlでpostできる:

ls | xargs -IXXXX curl -H POST $url -H 'Content-Type: application/json' -d @./XXXX -H "Authorization: Bearer ${BEARER_TOKEN}"

そこでそれぞれの結果をresXXXXという名前のファイルに保存したいのでリダイレクト(>)を使ってみるのだが次のコードだとうまく行かない:

ls | xargs -IXXXX curl -H POST $url -H 'Content-Type: application/json' -d @./XXXX -H "Authorization: Bearer ${BEARER_TOKEN}" > res_XXXX

思いついた解法:

ls | xargs -IXXXX  bash -c "curl -H POST $url -H 'Content-Type: application/json' -d @./XXXX -H \"Authorization: Bearer ${BEARER_TOKEN}\" > res_XXXX"

jqコマンド

次のコマンドは何も返ってこない:

ls | grep json | xargs -IXXXX curl -H POST $url -H 'Content-Type: application/json' -d @./XXXX -H "Authorization: Bearer ${BEARER_TOKEN}" | jq . | echo

しかしechoの代わりにcatにするとjsonが返ってくる:

ls | grep json | xargs -IXXXX curl -H POST $url -H 'Content-Type: application/json' -d @./XXXX -H "Authorization: Bearer ${BEARER_TOKEN}" | jq . | cat

解説

echo

echoは標準入力を受け取らない

echo "hoge" | echo
echo "hoge" | cat
echo "hoge" | echo -e

awscliでECSのクラスターの全てのサービスを1にするコマンド

aws ecs list-services --cluster $cluseter | jq '.serviceArns[]' | sed 's/arn:aws:ecs:hogehoge:service\/cluster\///g' | sed 's/"//g' |xargs -IXXX aws ecs update-service --cluster $cluster--service XXX --desired-count 1 | cat

shell scriptでエラーがあった時に中断させる

set -e

参考

Back to top