Closed7

Bash の Process Substitution で read write されるファイルの代替(clasp で `.clasprc.json` をファイルにしないで認証させたい)

hankei6kmhankei6km
  • GitHub Actions で clasp を使う場合 .clasprc.json をどこかに保存する必要がある
  • clasp はコマンド実行時にリフレッシュトークンで更新されたトークンなどを .clasprc.json へ書き込む
  • できればファイルをストレージ上に保存したくない(うっかりキャッシュに含めてしまう可能性)

ということで Process Substitution でどうにかできないかと考えた。

こういうイメージ $ clasp --auth <(gen-clasprc.sh) push

ここで問題なのは「read write されるファイルの代わりにするのはどうなの?」という部分。

hankei6kmhankei6km

read と write は単独でならできる。
(write は日経 Linux 最新号のシス管系女子でやってた)

read でよくみかける例。

$ diff test1.json test2.json
1c1
< {"abc":123,"efg":456,"ABC":123,"EFG":456}
---
> {"abc":123,"efg":457,"ABC":123,"EFG":456}

$ diff <(jq . test1.json) <(jq . test2.json)
3c3
<   "efg": 456,
---
>   "efg": 457,

write の例、あまりよくないが。

$ echo -ne 'test\ncheck\n--end--\n' | tee >( grep check)
test
check
--end--
check
hankei6kmhankei6km

そもそもパーミッションはどうなっているのか?

$ ls -l <(:)
lr-x------ 1 node node 64 Jan 20 13:21 /dev/fd/63 -> 'pipe:[41095079]'

$ ls -l >(:)
l-wx------ 1 node node 64 Jan 20 13:21 /dev/fd/63 -> 'pipe:[41093926]'

それぞれ read と write が付く。
<() で write も付いてないかなと思っていのだが。

hankei6kmhankei6km

ちなみに <>() は無い。

$ ls -l <>(:)
-bash: 予期しないトークン `(' 周辺に構文エラーがあります
hankei6kmhankei6km

<() に書き出したらどうなるのか。

$ echo "abc" | tee >(cat)
abc
abc
$ echo "abc" | tee <(echo efg)
abc
$ echo "${?}"
0

tee だとエラーにならないがこれはコマンド側の実装によるかな。

hankei6kmhankei6km

clasp で試してみたが上手くいかなかった。

$ bash scripts/gen-clasprc.sh > .clasprc.json
$ clasp --auth .clasprc.json push
└─ appsscript.json
└─ build/md2html.js
Pushed 2 files.
$ rm .clasprc.json
$ clasp --auth <(bash scripts/gen-clasprc.sh) push
Could not read API credentials. Are you logged in globally?

更新さればかりの .clasprc.json の内容を使ってもみたけど結果は同じ。

hankei6kmhankei6km

write 以前に何度か読み直しているような気もするのでちょっと捻っただけでは難しいかな。

ということでクローズ。

このスクラップは2022/01/20にクローズされました