- 2021/07
- 2021/07/01 Thu
- 2021/07/02 Fri
- 2021/07/03 Sat
- 2021/07/04 Sun
- 2021/07/05 Mon
- 2021/07/06 Tue
- 2021/07/07 Wed
- 2021/07/08 Thu
- 2021/07/09 Fri
- 2021/07/10 Sat
- 2021/07/11 Sun
- 2021/07/12 Mon
- 2021/07/13 Tue
- 2021/07/14 Wed
- 2021/07/15 Thu
- 2021/07/16 Fri
- 2021/07/17 Sat
- 2021/07/18 Sun
- 2021/07/19 Mon
- 2021/07/20 Tue
- 2021/07/21 Wed
- 2021/07/22 Thu
- 2021/07/23 Fri
- 2021/07/24 Sat
- 2021/07/25 Sun
- 2021/07/26 Mon
- 2021/07/27 Tue
- 2021/07/28 Wed
- 2021/07/29 Thu
- 2021/07/30 Fri
- 2021/07/31 Sat
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
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
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
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
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 ツール触ってみたら?という提案が合ったので明日はそれを触ろうかな
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]
で見れる
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
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]
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
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"
}
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 で保存してエラーが出ないことを確認した
環境変数の読み込みもシェルが違うと対応できないのでいろいろ工夫がありそうだった
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!
- 参考
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 を触っていこう
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
Oh My Zsh をインストールする
zsh で調べると Oh My Zsh の記事を多く見かけるので入れてみることにした
インストール用のシェルを実行するだけで OK
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
プロンプトや補完がわかりやすくなる
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 で指定するみたい
シェルスクリプトで標準入力
簡単なスクリプトを書いてて、標準出力した内容をスクリプトに渡したい
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.
テキストファイルを整形して、スクリプトに渡して処理が可能になる
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
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/
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 を使わない別の方法を考えることにした
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
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
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 になっていたのでどうしようかなと悩み中
また悩みが増えてきた
Gatsby をサブディレクトリにデプロイする
gatsby-config.js
に pathPrefix
を追加する
...
// sub directory
pathPrefix: `/tmp-2021`,
}
ビルドに --prefix-paths
オプションを追加する
$ gatsby build --prefix-paths
ビルドした成果物の確認でも --prefix-paths
オプションを追加して確認をする
$ gatsby serve --prefix-paths
サブディレクトリにデプロイして動作確認をした
- 参考
vim じゃない方法でシンタックスハイライトをしたい
vim -R xxx
以外な方法でシンタックスハイライトをしたい
ccat
ものがあるので使ってみた
インストール
brew install ccat
確認する
$ ccat --bg=dark ./test_helloworld.py
こんな感じで出力される
シェルスクリプトで標準入力 2
read
を使う
-p
オプションでメッセージも出力可能
$ vim ./input.sh
#!/usr/bin/env sh
read -p "input : " INPUT
echo "output : ${INPUT}"
実行してみる
$ ./input.sh
input : hello
output : hello
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
が指定されている
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
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
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"
}
]
スーパーユーザ権限が必要なファイルにリダイレクトする
通常のリダイレクトはこんな感じ
$ 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