Skip to content

Latest commit

 

History

History
1247 lines (876 loc) · 32.8 KB

README.md

File metadata and controls

1247 lines (876 loc) · 32.8 KB

2021/07

2021/07/01 Thu

Python でテストをやってみる

前に Python でスクリプトを書いてみたので、テストコードを書くことにしてみた
シンプルに "hello world!" と出力されているかをテストで書いてみる

こんなスクリプトを用意して

helloworld.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def main():
    message = helloWorld()
    print(message)

def helloWorld():
    return 'hello world!'

if __name__ == "__main__":
    main()

実行するとこんな感じ

$ python ./helloworld.py
hello world!

テストを書いてみる
unittest を使用してこんな感じに書く

test_hellowold.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import unittest
from helloworld import helloWorld

class TestHelloWorld(unittest.TestCase):

    def test_helloWorld(self):
        expected = 'hello world!'
        actual = helloWorld()

        self.assertEqual(expected, actual)

if __name__ == "__main__":
    unittest.main()

テストを実行するとこんな感じ

$ python ./test_helloworld.py 
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

2021/07/02 Fri

jq コマンドで出力した結果のダブルクォーテーションを外す

こんな JSON があって

{
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}

こんな感じで値を取得する

$ cat ./sample.json | jq '.key2'
"value2"

このダブルクォーテーションを外して、別の処理に渡したい
sed でダブルクォーテーションを空文字に変換することもできるけど

$ cat ./sample.json | jq '.key2' | sed 's/"//g'
value2

jq には -r オプションがあるのでそちらを使うと OK

$ cat ./sample.json | jq -r '.key2'
value2

2021/07/03 Sat

GitHub API で PR 作成

1 ヶ月以上手動で作成していたが、せっかくなので GitHub API 経由で PR を作成してみることにした

まずは Token の設定を変更する
Personal Access Tokens にアクセスして public_repo にチェックを入れた

こんな感じで環境変数を用意して

export GITHUB_TOKEN=
export GITHUB_USER=
export GITHUB_REPOSITORY=
export GITHUB_FEATURE_BRANCH=
export GITHUB_PR_TITLE=

curl で叩けば OK

curl -H "Authorization: token $GITHUB_TOKEN" \
  "https://api.github.com/repos/$GITHUB_USER/$GITHUB_REPOSITORY/pulls" \
  -d "{\"title\": \"$GITHUB_PR_TITLE\", \"head\": \"$GITHUB_USER:$GITHUB_FEATURE_BRANCH\", \"base\": \"main\"}"

push 後にタイトルとかは修正するが、本日分の PR は API で作成を行った
#63

2021/07/04 Sun

GitHub API でブランチ作成

昨日の続き
今日は branch を GitHub API で作成する

まずはこんな感じでリビジョンハッシュを取得する

curl -H "Authorization: token ${GITHUB_TOKEN}" \
  "https://api.github.com/repos/${GITHUB_USER}/${GITHUB_REPOSITORY}/git/refs/heads/${BASE_BRANCH}" -s \
  | jq -r '.[].object.sha'

がこの方法だとブランチの数だけリビジョンハッシュが出力されてしまう
なので jq をちょこっとだけ修正して、 main ブランチのリビジョンハッシュを取得できるようにする

curl -H "Authorization: token ${GITHUB_TOKEN}" \
  "https://api.github.com/repos/${GITHUB_USER}/${GITHUB_REPOSITORY}/git/refs/heads/${BASE_BRANCH}" -s \
  | jq -r '.[] | select(.ref == "refs/heads/main") | .object.sha'

このあとの処理でこのリビジョンハッシュは使うため、変数として用意しておく

github_hash=$(curl -H "Authorization: token ${GITHUB_TOKEN}" \
  "https://api.github.com/repos/${GITHUB_USER}/${GITHUB_REPOSITORY}/git/refs/heads/${BASE_BRANCH}" -s \
  | jq -r '.[] | select(.ref == "refs/heads/main") | .object.sha')

echo $github_hash

準備は完了
下記のように API を叩くことでブランチが作成できる

curl -X POST \
  -H "Authorization: token ${GITHUB_TOKEN}" \
  -d "{\"ref\": \"refs/heads/${GITHUB_FEATURE_BRANCH}\", \"sha\":\"${github_hash}\"}" \
  https://api.github.com/repos/${GITHUB_USER}/${GITHUB_REPOSITORY}/git/refs

2021/07/05 Mon

GitHub API を使って、 GitHub の画面を触らずに執筆ができる状態にした

昨日の続き
昨日までの内容を元にスクリプトを繋ぎ合わせてみた
これでブランチ作成や PR 作成もブラウザを使わずに作成できることが可能になった
執筆開始までのリードタイム削減に繋がった

## 環境変数の設定(未入力値は設定する)
export GITHUB_TOKEN=
export GITHUB_USER=
export GITHUB_REPOSITORY=
export GITHUB_BASE_BRANCH=main
export GITHUB_FEATURE_BRANCH="feature/add_$(date "+%Y-%m-%d")"
export GITHUB_PR_TITLE=
export GITHUB_PR_DESCRIPTION="$(date "+%Y/%m/%d")"

## リビジョンハッシュの取得
github_hash=$(curl -H "Authorization: token ${GITHUB_TOKEN}" \
  "https://api.github.com/repos/${GITHUB_USER}/${GITHUB_REPOSITORY}/git/refs/heads/${BASE_BRANCH}" -s \
  | jq -r '.[] | select(.ref == "refs/heads/main") | .object.sha')

## リモートブランチの作成
curl -X POST \
  -H "Authorization: token ${GITHUB_TOKEN}" \
  -d "{\"ref\": \"refs/heads/${GITHUB_FEATURE_BRANCH}\", \"sha\":\"${github_hash}\"}" \
  https://api.github.com/repos/${GITHUB_USER}/${GITHUB_REPOSITORY}/git/refs

## ローカルブランチを作成し、空コミットをプッシュする
git fetch origin
git checkout -b ${GITHUB_FEATURE_BRANCH} origin/${GITHUB_FEATURE_BRANCH}
git commit --allow-empty -m "${GITHUB_PR_TITLE}"
git push origin ${GITHUB_FEATURE_BRANCH}

## PR の作成
curl -H "Authorization: token ${GITHUB_TOKEN}" \
  "https://api.github.com/repos/${GITHUB_USER}/${GITHUB_REPOSITORY}/pulls" \
  -d "{\"title\": \"${GITHUB_PR_TITLE}\", \"body\": \"${GITHUB_PR_DESCRIPTION}\", \"head\": \"${GITHUB_USER}:${GITHUB_FEATURE_BRANCH}\", \"base\": \"${GITHUB_BASE_BRANCH}\"}"

同期から CLI ツール触ってみたら?という提案が合ったので明日はそれを触ろうかな

2021/07/06 Tue

GitHub CLI を触る

昨日の続き
昨日までは GitHub API でブランチなどを作成していたが今日からは GitHub CLI を触ってみることにする

インストール
homebrew でインストールをした

$ brew install gh

$ gh --version
gh version 1.12.1 (2021-07-01)
https://github.com/cli/cli/releases/tag/v1.12.1

まずは GitHub CLI でログインする

$ gh auth login

Github.com や SSH などを選択して進める
Token を入力すると下記エラーが出た

? Paste your authentication token:
error validating token: missing required scopes 'repo', 'read:org'

Token の権限が足りていないため、Personal Access Tokens から足りていない権限を追加を行う
再度実行して、 Token 入力後も問題無く通過した

$ gh auth login
...
insufficient OAuth scopes

GitHub CLI が使えるようになったので動作確認でこのリポジトリの README を見てみる

$ gh repo view honyanya/365

gh repo view [repository] で見れる

2021/07/07 Wed

GitHub CLI で PR を作成する

非常に簡単にできた
リモートブランチ作成までは作成と空コミットを行って GitHub CLI のコマンドを実行する

カレントブランチが PR を作成したいブランチであることを確認する

$ git branch
* feature/add_2021-07-07
  feature/add_ssg
  main

gh pr create で作成ができる
Title, Body を入力すれば完了する

$ gh pr create

Creating pull request for feature/add_2021-07-07 into main in honyanya/365

? Title #67
? Body <Received>
? What's next? Submit
https://github.com/honyanya/365/pull/67

2021/07/08 Thu

GitHub CLI での入力を nano から vim にする

デフォルトだと nano が選択されてしまう

$ gh pr create

Creating pull request for feature/add_2021-07-08 into main in honyanya/365

? Title #68
? Body [(e) to launch nano, enter to skip]

EDITOR=vim を設定すれば vim で入力することが可能になる

$ export EDITOR=vim
$ printenv EDITOR
vim

(e) to launch nano から (e) to launch vim になっている

$ gh pr create

Creating pull request for feature/add_2021-07-08 into main in honyanya/365

? Title #68
? Body [(e) to launch vim, enter to skip] 

実行時に EDITOR=vim を指定しても OK

$ EDITOR=vim gh pr create

Creating pull request for feature/add_2021-07-08 into main in honyanya/365

? Title #68
? Body [(e) to launch vim, enter to skip] 

2021/07/09 Fri

365 で使う GitHub CLI の操作

昨日は PR を作ったので、他の操作も行ってみる

PR の編集

gh pr edit [PR number] で実行できる
--title でタイトルの変更
--add-assignee で担当者の追加

## タイトルの変更
$ gh pr edit 68 --title "feature/add_2021-07-08][add] GitHub CLI での入力を nano から vim にする"
https://github.com/honyanya/365/pull/68

## 担当者の変更
$ gh pr edit 68 --add-assignee @me
https://github.com/honyanya/365/pull/68

PR のマージ
gh pr merge [PR number] で実行できる

$ gh pr merge 68
? What merge method would you like to use? Create a merge commit
? Delete the branch locally and on GitHub? Yes
? What's next? Submit
✓ Merged pull request #68 (feature/add_2021-07-08][add] GitHub CLI での入力を nano から vim にする)
✓ Deleted branch feature/add_2021-07-08 and switched to branch main

2021/07/10 Sat

jq で整形したものをファイルに書き込む

JSON を jq で整形してファイルに書き込みたかった
下記のコマンドでは失敗する

$ echo '{"key1":"value1","key2":"value2"}' | jq > ./test.json
jq - commandline JSON processor [version 1.5]
Usage: jq [options] <jq filter> [file...]
...

必ず要素の指定が必要
. を指定してあげればファイルに書き込み可能

$ echo '{"key1":"value1","key2":"value2"}' | jq . > ./test.json
$ cat ./test.json 
{
  "key1": "value1",
  "key2": "value2"
}

2021/07/11 Sun

curl: (3) Illegal characters found in URL の対応

ちょっと bash でスクリプトを書いてて
なぜか curl でエラーが出るようになってしまった

$ ./sample_script.sh 
curl: (3) Illegal characters found in URL

./sample_script.sh は環境変数を読み込むような形にしていた

## 環境変数の読み込み
. ./.env

原因は ./.env が CRLF で保存されており、 ^M が入っていることでした......
LF で保存してエラーが出ないことを確認した

環境変数の読み込みもシェルが違うと対応できないのでいろいろ工夫がありそうだった

2021/07/12 Mon

bash で ! を出力する

bash で ! は最新のコマンドが実行される
ヒストリ展開とも呼ばれてるみたい
なので純粋に ! を使うことができない

$ echo "!"
bash: !: event not found

例えば hello world! と出力しても ! がヒストリが参照されこのような実行になってしまった

$ echo "hello world!"
echo "hello world"
hello world

解決策は set +H で機能を無効化することができる

$ set +H

$ echo "!"
!

$ echo "hello world!"
hello world!

2021/07/13 Tue

hub と gh

ちょっと前まで GitHub CLI である gh を使った内容を書いていた
数ヶ月前に hub コマンドについてもちょっと話をした記憶があって、リポジトリの状況を見てみることにした

hub
リポジトリ: github/hub: A command-line tool that makes git easier to use with GitHub.
hub 2.14.2 が latest で 2020/03/06 以降の更新は無い感じ

gh リポジトリ: cli/cli: GitHub’s official command line tool
GitHub CLI 1.12.1 が 13 日前にリリースされている

hub の情報は特に追わなくても大丈夫そう
gh を触っていこう

2021/07/14 Wed

shell を切り替える

bash 以外にも zsh を触っておいた方が良いかなと思ってて
なかなか重い腰を上げられていないが、切替方法をメモしておく

shell の一覧

$ cat /etc/shells 
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

zsh に切り替える

$ /bin/zsh

永続的に切り替える

$ chsh -s /bin/zsh
% printenv SHELL
/bin/zsh

戻す時も chsh で変更する

$ chsh -s /bin/bash

2021/07/15 Thu

Oh My Zsh をインストールする

zsh で調べると Oh My Zsh の記事を多く見かけるので入れてみることにした
インストール用のシェルを実行するだけで OK

sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

プロンプトや補完がわかりやすくなる

2021/07/16 Fri

Mac の date コマンドで 1 日前を指定する

Mac だと -d オプションで指定ができなかったのでメモ
普段 CentOS などでは下記のように実行している

$ date '+%Y-%m-%d' -d '1 day ago'
2021-07-15

Mac だと -v オプションで指定する必要がある

$ date -v -1d '+%Y-%m-%d'
2021-07-15

どうやら Free BSD 系などの OS は -v で指定するみたい

2021/07/17 Sat

シェルスクリプトで標準入力

簡単なスクリプトを書いてて、標準出力した内容をスクリプトに渡したい

cat - と入力することで可能になる
入力したものがそのまま出力される

こんな感じのスクリプトを書いた
標準出力を渡して、文字を結合して出力を行うスクリプト

#!/bin/sh

readonly CONTENTS=$(cat -)
echo $CONTENTS "is input value."

実行結果

$ echo 'a b c d e' | ./sample_input.sh
a b c d e is input value.

テキストファイルを整形して、スクリプトに渡して処理が可能になる

2021/07/18 Sun

git でカレントブランチを取得

$ git symbolic-ref --short HEAD
feature/add_sgg_by_gatsby

echo での展開例
git commit 時にも応用できる

$ echo "[$(git symbolic-ref --short HEAD)][add] commit messages"
[feature/add_sgg_by_gatsby][add] commit messages

2021/07/19 Mon

favicon の画像を取得する

他に登録した favicon のアイコンをそのまま使いたかった
下記のようにすれば取得ができる
例として Google の favicon を取得している

https://www.google.com/s2/favicons?domain=https://www.google.com/

ダウンロードしたい場合は wget で取得すれば OK

$ wget -O favicon.ico https://www.google.com/s2/favicons?domain=https://www.google.com/

2021/07/20 Tue

BusyBox date を触る

date コマンドで実行しているスクリプトがあって
Alpine Linux の環境で動かすと期待度通りに動いてくれなかった

そもそも date コマンドには 3 つあるみたい

  • BSD date
  • GNU coreutils date
  • BusyBox date

2021/07/16 の記事では BSD date と GNU coreutils date について書いたが、今回は BusyBox date を簡単に触る

Docker で Alpine Linux を触る

$ docker run -it alpine:latest /bin/sh

date コマンドを見てみる

# date --help
BusyBox v1.33.1 () multi-call binary.
...

もちろん BSD date や GNU coreutils date で使える日付操作のオプションが使えない

# date '+%Y-%m-%d' -d '1 day ago'
date: invalid date '1 day ago'

# date '+%Y-%m-%d' -v -1d
date: unrecognized option: v
...

日付計算で出力する必要がある

# date '+%Y-%m-%d' -d "1970.01.01-00:00:$(( $( date +%s ) - $(( 24 * 60 * 60 )) ))"
2021-07-19

月末の日を求めたかったが計算がややこしくなりそうだったので BusyBox date を使わない別の方法を考えることにした

2021/07/21 Wed

Base64 のエンコード・デコードをワンライナーで実行する

昔サーバ構築の際に教わったが忘れてしまっていたので
Perl を用いてワンライナーで実行することができるので楽

Base64 へエンコードする

$ echo "user1:password1" | perl -MMIME::Base64 -0777 -ne 'print encode_base64($_)'
dXNlcjE6cGFzc3dvcmQxCg==

Base64 からデコードする

echo "dXNlcjE6cGFzc3dvcmQxCg==" | perl -MMIME::Base64 -0777 -ne 'print decode_base64($_)'
user1:password1

2021/07/22 Thu

Gatsby.js 触る

gatsby cli あることが前提

gatsby-starter-blog テーマを使ってプロジェクトを作成する

$ gatsby new gatsby-starter-blog https://github.com/gatsbyjs/gatsby-starter-blog

作成されたプロジェクトに移動する

$ cd gatsby-starter-blog/

開発用環境を起動する
ホットリロードで自動更新される
実行後 http://localhost:8000/ で確認

$ gatsby develop

デプロイ用に成果物をビルドする
ビルドされたファイルは ./public/ に配置される

$ gatsby build

ビルドされた成果物を元にサーバを起動して動作確認を行う
デプロイ前に実施する
実行後 http://localhost:9000/ で確認

$ gatsby serve

2021/07/23 Fri

USB の読み込みができなくなった

ちょっとラップトップの SSD を整理しようかなと思い、ちょっと前に使ってた USB を出して接続してみた
最初はファイルが見れていたがある時から「ディスクの不正な取り出し」というポップアップが出てきて、数回試しても読み込みができなくなった

USB だけに入れていたデータどうしようと思いつつも df コマンドを叩いてみた

$ df -h | grep '/dev/disk3s1'
/dev/disk3s1    29Gi   13Gi   17Gi    44%        0       0  100%   /Volumes/usb-32g

grep しているので分かりづらいのでヘッダー情報も付けてみる

$ df -h | egrep 'Filesystem|/dev/disk2s2'
Filesystem      Size   Used  Avail Capacity  iused   ifree %iused  Mounted on
/dev/disk3s1    29Gi   13Gi   17Gi    44%        0       0  100%   /Volumes/usb-32g

isued / ifree がともに 0 で %iused が 100% になっている
確かにファイル数が多かったが、 isued / ifree がともに 0 になっていたのでどうしようかなと悩み中
また悩みが増えてきた

2021/07/24 Sat

Gatsby をサブディレクトリにデプロイする

gatsby-config.jspathPrefix を追加する

  ...
  // sub directory
  pathPrefix: `/tmp-2021`,
}

ビルドに --prefix-paths オプションを追加する

$ gatsby build --prefix-paths

ビルドした成果物の確認でも --prefix-paths オプションを追加して確認をする

$ gatsby serve --prefix-paths

サブディレクトリにデプロイして動作確認をした

2021/07/25 Sun

vim じゃない方法でシンタックスハイライトをしたい

vim -R xxx 以外な方法でシンタックスハイライトをしたい
ccat ものがあるので使ってみた

インストール

brew install ccat

確認する

$ ccat --bg=dark ./test_helloworld.py

こんな感じで出力される

ccat

2021/07/26 Mon

シェルスクリプトで標準入力 2

read を使う
-p オプションでメッセージも出力可能

$ vim ./input.sh
#!/usr/bin/env sh

read -p "input : " INPUT
echo "output : ${INPUT}"

実行してみる

$ ./input.sh
input : hello
output : hello

2021/07/27 Tue

ls を 1 行で出力する

通常 ls を実行するとこんな感じで複数列で出力される
ファイル、ディレクトリ名の長さのやターミナル長さで良い感じに決まってる?

$ ls ./2021/06/images/
01	07	10	16	18	20

これを 1 列で表示したい場合
-l オプションなどを付けるが、付加情報がある

$ ls -l ./2021/06/images/
total 0
drwxr-xr-x  5 user  staff  170  6  1 06:59 01
drwxr-xr-x  8 user  staff  272  6 19 15:38 07
drwxr-xr-x  5 user  staff  170  6 19 15:38 10
drwxr-xr-x  3 user  staff  102  6 19 15:38 16
drwxr-xr-x  3 user  staff  102  6 19 15:38 18
drwxr-xr-x  4 user  staff  136  6 20 23:18 20

名前だけを 1 列で表示させたい場合
-1 オプション(数字)を指定することで可能

$ ls -1 ./2021/06/images/
01
07
10
16
18
20

ちなみに -2 など -n ではなさそうだった

$ ls -2 ./2021/06/images/
ls: illegal option -- 2
usage: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [file ...]

usage に書いてあるが最後に 1 が指定されている

2021/07/28 Wed

Docker for Mac の入力補完

homebrew でインストールした Docker なら

$ ls -1 /Applications/Docker.app/Contents/Resources/etc/
docker-compose.bash-completion
docker-compose.zsh-completion
docker-machine.bash-completion
docker-machine.zsh-completion
docker.bash-completion
docker.zsh-completion

に補完用のファイルがあるのでシンボリックリンクを貼れば OK

ln -s /Applications/Docker.app/Contents/Resources/etc/docker.bash-completion $(brew --prefix)/etc/bash_completion.d/docker
ln -s /Applications/Docker.app/Contents/Resources/etc/docker-machine.bash-completion $(brew --prefix)/etc/bash_completion.d/docker-machine
ln -s /Applications/Docker.app/Contents/Resources/etc/docker-compose.bash-completion $(brew --prefix)/etc/bash_completion.d/docker-compose

これで補完ができるようになる

$ docker
build       exec        kill        port        save        system
checkpoint  export      load        ps          search      tag
commit      help        login       pull        secret      top
container   history     logout      push        service     unpause
cp          image       logs        rename      stack       update
create      images      network     restart     start       version
deploy      import      node        rm          stats       volume
diff        info        pause       rmi         stop        wait
events      inspect     plugin      run         swarm

$ docker-compose
build    down     kill     ps       rm       stop     version
bundle   events   logs     pull     run      top
config   exec     pause    push     scale    unpause
create   help     port     restart  start    up

2021/07/29 Thu

gh の入力補完(zsh はうまくいってない)

公式に乗っているのでそのとおりにやる

~/.bashrc に以下を記述した

eval "$(gh completion -s bash)"

読み込み後確認すると良い感じに補完できる

$ source ~/.bashrc
$ gh
actions     auth        completion  help        release     secret
alias       browse      config      issue       repo        ssh-key
api         co          gist        pr          run         workflow

$ gh pr
checkout  close     create    edit      merge     reopen    status
checks    comment   diff      list      ready     review    view

zsh も設定したがうまくいかない......

$ gh completion -s zsh > /usr/local/share/zsh/site-functions/_gh

~/.zshrc に追記

autoload -U compinit
compinit -i

補完がこんな感じになる
素の zsh に戻してからやる必要があるとか?

gh
  -- a:c:t:i:o:n:s:	:L:e:a:r:n: :a:b:o:u:t: :w:o:r:k:i:n:g: :w:i:t:h: :G:i:t:
  -- a:l:i:a:s:	:C:r:e:a:t:e: :c:o:m:m:a:n:d: :s:h:o:r:t:c:u:t:s

2021/07/30 Fri

jq で絞り込みをして別の JSON を作る

こんな JSON がある

[
  {
    "key1": "value1a",
    "key2": "value1b",
    "key3": "value1c",
    "key4": {
      "subkey41": "subvalue1a",
      "subkey42": "subvalue1b",
      "subkey43": "subvalue1c"
    }
  },
  {
    "key1": "value2a",
    "key2": "value2b",
    "key3": "value2c",
    "key4": {
      "subkey41": "subvalue2a",
      "subkey42": "subvalue2b",
      "subkey43": "subvalue2c"
    }
  },
  {
    "key1": "value3a",
    "key2": "value3b",
    "key3": "value3c",
    "key4": {
      "subkey41": "subvalue3a",
      "subkey42": "subvalue3b",
      "subkey43": "subvalue3c"
    }
  }
]

subkey 42 の値を取得したい場合は下記のように書く

$ cat test.json | jq '.[].key4.subkey42'
"subvalue1b"
"subvalue2b"
"subvalue3b"

配列にするならこんな感じ

$ cat test.json | jq -r '. | [ .[].key4.subkey42 ] '
[
  "subvalue1b",
  "subvalue2b",
  "subvalue3b"
]

key 名有りのオブジェクトにしたいならこんな感じ

$ cat test.json | jq -r '. | [{ subkey42: .[].key4.subkey42 }]'
[
  {
    "subkey42": "subvalue1b"
  },
  {
    "subkey42": "subvalue2b"
  },
  {
    "subkey42": "subvalue3b"
  }
]

2021/07/31 Sat

スーパーユーザ権限が必要なファイルにリダイレクトする

通常のリダイレクトはこんな感じ

$ touch test.md
$ echo "# test"  >> test.md
$ cat test.md
# test

これをスーパーユーザが必要なファイルで行うとすると Permission denied になる

$ echo "192.168.56.101 development.local" >> /etc/hosts
-bash: /etc/hosts: Permission denied

$ sudo echo "192.168.56.101 development.local" >> /etc/hosts
-bash: /etc/hosts: Permission denied

これを回避するために 2 つの方法があるみたい
まず 1 つ目が sh -c を使用する方法

$ sudo sh -c 'echo "192.168.56.101 development.local" >> /etc/hosts'

$ tail -n 2 /etc/hosts
::1             localhost
192.168.56.101 development.local

もう 1 つが tee を使用する方法

$ echo "192.168.56.101 development.local" | sudo tee -a /etc/hosts
192.168.56.101 development.local

$ tail -n 2 /etc/hosts
::1             localhost
192.168.56.101 development.local