bombadillo A non-web client for the terminal, supporting Gopher, Gemini and much more.
![Terminal Trove - The $HOME of all things in the terminal.](https://cdn-ak-scissors.b.st-hatena.com/image/square/940e689cba77839a3f87c79e320c68b825f893fc/height=288;version=1;width=512/https%3A%2F%2Fterminaltrove.com%2Fog%2Fog.png)
SREチームの長田です。 みなさま開発・運用上の定形オペレーションに伴うタスク実行をどのように管理していますか? 今回は make をタスクランナーとして使う例を紹介します。 タスクランナーがほしい タスクランナーを使う主なモチベーションは以下の2つです。 タスクをリスト化したい タスクの実行インターフェイスを統一したい タスクがリスト化されていれば、それ自体が生きたドキュメントとして機能します。 また、タスクの実行インターフェイスが統一されていれば、 例えばタスクに前処理や後処理を追加したとしても、 開発・運用メンバーが実行するべき操作が変わることはありません。 操作変更の周知コストも下がりますし、変更に伴う操作ミスも減らすことができます。 タスクランナーに求めるもの タスクランナーの機能としては必要最低限のものがよいと考えています。 高機能なタスクランナーも魅力的ではあるのですが、タス
仕事用のマシンをM1 MacBook Proに交換してもらったので、開発環境を整え直しました。 2年ほど fish を使ってきたのだけれど、普段は良いのだけれど、ちょっと自動化したくなったときに、やはりPOSIX準拠じゃないシェルはなかなか難しかった。macOSの標準も zsh になったことだし、久しぶりに戻ってみることにした。 導入 現代なので XDG Base Directory Specification に乗っかっておくことにする。 Arch Linux の Wiki がよくまとまっていて助かるのでこれを参考にして進めた。 zshの場合は ZDOTDIR を指定するといいのだけれど、これをどこで指定するのかという問題がある。zshの起動時に最初に読み込まれるユーザー設定は ~/.zshenv なのだけれど、ここに ZDOTDIR を書くということは .zshenv だけホームディレ
bash のシェルスクリプトを書くときに、いつも脳死で以下をやっている。(同僚が整備してくれたものをコピペしている) エディタなり CI で shellcheck をまわす set -euxo pipefail と冒頭に書く こんな感じ #!/bin/bash set -euxo pipefail いつまでもコピペではさすがにアレなので、意味を調べたメモ。 shellcheck koalaman/shellcheck: ShellCheck, a static analysis tool for shell scripts イケてない書き方に警告を出してくれる それぞれの警告にはエラーコード割り振られていてとても便利 エラーコードごとに正誤例、解説が書かれているのでわかりやすい SC1000 の例 CI もそうだし、エディタのプラグインも充実 しているのでとりあえず入れておくと良い set
この記事ははてなエンジニア Advent Calendar 2020の6日目の記事です。 qiita.com 5日目は id:mizdra さんによるpolyfill を深堀りするでした。フロントエンド周りは弱い自分としてもこの記事を読むだけでpolyfillの概要から今後どうすると良いかなど知れてとてもありがたい記事でした。 www.mizdra.net さて今日は視点変えてツールの話を書きます。毎日使っているツールこそ、提供されている便利な機能を把握しておきたい。Macで使ってるターミナルアプリ「iTerm2」について書きます。 iterm2.com まずはみんながひょっとしたら知らない基本操作についていくつか紹介し、後半はTriggersという機能の使い方をいくつか紹介します。 (記事執筆時点ではver.3.4を使っています) tl;dr 公式ドキュメントにいろいろ書いてあるので読み
普段はsystemd経由で実行しているコマンドをCLIから実行したい、環境変数もsystemd経由で起動するときと同様にセットしたいのでenvfile(EnvironmentFile)をそのまま使いたいんだけどなんか微妙にやりにくくないか、と思って何度か調べたことがあるんだけど、あんまりうまい方法が検索結果に出てこない。 んだけど、あれ、これ簡単じゃん。(追記: これはごく単純なケースでしか動かなかった、後段参照) $ env $(cat myenvfile | grep -v '^#') target-commandenvfileをシェルスクリプトとして実行して追加された変数をなんとかexportすれば……みたいに考えてたけどenvコマンドで一発だった。変なコメントとか入ってると厄介だけど、こんな感じでいいのでは。ということでメモ。 空白を含む値の処理 まあいいやとスルーしてたけど値が空
前提として、/bin/sh は、デフォルトでは、RHEL系の場合bashシェル、Debian系の場合dashシェルへのsymlinkになっています。この2つのシェルの挙動は細かいところで結構異なります。そもそもの思想として、dashシェルはPOSIX互換を目指す軽量なシェルであり、bashは拡張された高機能なシェル。なのでbash前提で書かれたシェルスクリプトがdashでは動かない、みたいなことはよくあります。そういう感じで困ることがままありますが今回もそういう話。 例えば % sh -c "sleep 100" のようなコマンドを実行した場合、呼び出し元の子プロセスが sh になり、その更に子プロセスが sleep になると直感的には思うでしょう。つまり以下のような具合。 . \_ sh -c sleep 100 \_ sleep 100 しかし、 sh の実体が bash である場合な
タイトルの通り、UNIXの「uniq」コマンドを使って、2つのファイルから 論理和(OR) 論理積(AND) 排他的論理和(XOR) 差集合(A-B) 差集合(B-A) を取得する方法を示します。 方法 前提:入力ファイル 確認のため、以下のような、ファイルa・bを使用します。
初級者向けに『自分がシェルスクリプト書くときに気をつけていること』をまとめてみました。 @masudaKの『シェルスクリプトを書く際に気を付けていること8箇条』の乗っかりエントリです。 内容は重複しないように書いてますので合わせて読んでください! 基本的にLinuxの/bin/sh、/bin/bashを想定しています。 テキスト処理は標準入力から受け取って標準出力に出す テキストを扱う小さなツールを作りましょう。 引数はオプション情報を渡すのに使います。 そうすればgrep、sort、uniqなどの便利なコマンドとパイプで連携できます。 grep ERROR /tmp/test.log | my_cmd1.sh 192.168.1.1 | sort 全てを実行する1つのスクリプトを作るのはたいへんだし、応用が効かないです。 人間に伝えたいメッセージは標準エラー出力に出す パイプでつないだ時
最近 prezto 入れたんですよ。prezto。そしたらいつものシェル世界が見違えるほど使いやすくなって身長も 3 メートルくらい伸びたんですが、それは余談でして、prezto 入れた後に less 使ってみたら余りの変わりっぷりに驚いたんです。 これを機に man page を読み直してみたら更に驚き。less ってこんなスゴイ物だったのか!みたいな。今回はそんな less の底力を紹介します。 環境変数 $LESS less には様々なオプションがあるのですが、これを予め環境変数 $LESS に設定しておくと、毎度 less ファイル名 と打つだけでそれが有効になります。更に、後述しますが、この設定は less 起動中にオン・オフして切り替えることが可能です。 # 最低限でもこれくらいは設定しておこう export LESS='-i -M -R' # 僕は後述の物を全部付けてます(-
本記事が切っ掛けとなってお声がけを頂き、本記事の増補リファイン版となる記事をSoftwareDesign 2018年1月号のシェルスクリプト特集第2章として執筆しました。リファイン版には、この記事で触れていない文法面での分かりにくさについての解説が含まれています。その文法面での分かりにくさの解説の一部に相当する記事もありますので、ぜひそちらも併せてご覧下さい。 Shell Script Advent Calendarをご覧の皆様、図々しくも5日目に続く2度目のエントリーのPiroです。 前回は自作のBashスクリプト製Twitterクライアントをネタに実装を解説しましたが、今日は他の言語で多少のプログラミング経験はあるんだけど、どうにもシェルスクリプトは苦手だ……という人のための、シェルスクリプトによるプログラミングの勘所を解説してみようと思います。多分、プログラミング入門レベルの人や上級
Eureka EngineeringLearn about Eureka’s engineering efforts, product developments and more.
bash3.2.25とbash4.1.5で実験 参考:http://mlog.euqset.org/archives/linux-users/106994.html システム変数PIPESTATUSを使う $ (exit 1) | (exit 0) | (exit 3) | (exit 0) $ echo ${PIPESTATUS[@]} 1 0 3 0 PIPESTATUSという配列に、最後にパイプ使ったときの各コマンドの終了コードが入ってる pipefailオプションを使う $ set -o pipefail $ (exit 1) | (exit 0) | (exit 3) | (exit 0) $ echo $? 3 pipefailオプションを使うと、各コマンドで最後にゼロ以外だった終了コードが返る set -eと組み合わせて使うと、途中のコマンドがエラーだったときにもちゃんと死ぬ
はい、おつカレー様です。 bashを使ったシェルスクリプトでパイプを使っても戻り値をちゃんと取りたいときの話です。 シェルスクリプトの戻り値 シェルスクリプトでの戻り値取るときに $? を使うことがあると思います。 $ ls / # こっちは正常 $ echo $? 0 $ ls /notfounddir # こっちはエラー $ echo $? 1コマンドのログを取りたいなと思ってteeとかつなげちゃうとteeの戻り値になっちゃって取れないですよね。 $ ls /notfounddir | tee test ls: /notfounddir: No such file or directory $ echo $? 0 # <-アレ? ${PIPESTATUS[@]} こういう場合は、${PIPESTATUS[@]}を使うことで取ることができます。 $ ls / | tee test.log
僕はシェルスクリプトを触ったことがほぼないのですが、C言語でいうsprintfのようなことをしたくて手間取ったのでメモです。シェルはbashです。 シェルスクリプトでprintfのようなことをするにはprintfコマンドを使って下記のようにします。 value=1 printf "aaa%03d\n" $value 今回は整形済みの結果を変数に代入したかったので、sprintfのようなものはないのかと思って探しました。結果的には、下記のようにしてprintfコマンドの結果を代入することでsprintfのようなことができました。 value=1 result=$(printf "aaa%03d" $value) シェルスクリプトの文法を知っていれば当たり前なのでしょうが、「シェルスクリプト sprintf」などのキーワードからこの書き方を検索するのが結構大変だったので。
乗算の演算子は「*」ですが、UNIXでは「*」はワイルドカードという特別な意味がありますので、エスケープ文字「\」を使用して「\*」と書きます。また、演算子の前後のスペースは省略できませんので注意してください。以下は四則演算のサンプルスクリプトです。 expr_test.sh #!/bin/sh a=`expr 5 + 3` b=`expr 5 - 3` ab=`expr $a + $b` c=`expr 5 \* 3` d=`expr 5 / 3` e=`expr 5 % 3` echo "a=$a" echo "b=$b" echo "ab=$ab" echo "c=$c" echo "d=$d" echo "e=$e"
変数 シェル変数 変数は文字列や数値など、さまざまなデータを記憶しておくものです。変数名に使える文字は、英数字または「 _ 」(アンダーバー)で、1文字目に数字は使えません。変数に値を代入するには「変数名=値」とします。「=」の前後にはスペースやタブを入れることはできません。変数を参照する場合は、変数名の前に「$」を付けます。下記の例を参考に解説します。 test.sh #!/bin/sh #-----変数に値を代入します----- PARA1="string" PARA2=string PARA3=3 PARA4=`date '+%Y-%m-%d'` #-----変数を「echo」で表示します----- echo "PARA1 = ${PARA1}" echo "PARA2 = ${PARA2}" echo "PARA3 = ${PARA3}" echo "PARA
ホーム 検索 - ログイン | | ヘルプ 技術/UNIX/なぜnohupをバックグランドジョブとして起動するのが定番なのか?(擬似端末, Pseudo Terminal, SIGHUP他) [ Prev ] [ Next ] [ 技術 ] 何をいまさら当たり前の事を・・・と思われるだろう。 $ nohup long_run_batch.sh & SSHからログアウト後も実行を続けたいバッチジョブを、"&"を付けてバックグラウンドジョブとしてnohupから起動するのは定番中の定番である。 しかし、「nohupを使わなくても実行を続けることが出来る」やり方があったり、さらには「nohupを付けてもログアウト時に終了してしまう」パターンがあるとしたらどうだろう? そして、ある日あなたの後輩や同僚がこれらについてあなたに質問してきたら、あなたはどう答えるだろうか? 「Web上で検索したら見つか
Linuxでcoreutils が利用可能なら、timeout コマンドを使いましょう。なお、Mac であれば brew install coreutils して gtimeout が使えます。 timeout Usage: timeout [OPTION] NUMBER[SUFFIX] COMMAND [ARG]... or: timeout [OPTION] man には以下のように書かれています。デフォルトの挙動が使いやすそうです。 コマンドがタイムアウトし、--preserve-status が指定されていない場合、 終了ステータスは 124 になります。それ以外の場合、COMMAND の終了ステータスが 終了ステータスになります。シグナルが指定されていない場合、タイムアウト時には TERM シグナルが送られます。この TERM シグナルにより、TERM シグナルをブロック もしく
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く