実践ポータブル シェルスクリプト 〜 シェル関数によるLinuxとmacOSの移植性・互換性問題の攻略方法
はじめに シェルスクリプトは移植性が低い言語です。それは各コマンドの実装が複数あり挙動がそれぞれ異なるからです。POSIX で標準化されている範囲であれば最低限の移植性は期待できますが、それも完璧なものではなく機能的に不十分であることも多いです。この記事では「標準出力のバッファリング問題」を例として、Linux (GNU) と macOS (BSD)...
View ArticlebashのTIPSの個人的まとめ
ヒアドキュメント 複数行のテキストを処理する機能 例えば以下のような形 (EOLの部分は任意。他にEOSやEOFなどもよく使われる) cat << EOL >> temp.txt line1 line2 line3 EOL これを使うとwhile文やfor文、変数への代入が楽になったりする。 cat << EOL | while read r...
View Articlebashの変数の展開がいつ行われるのか? あれ、代入済みなのに反映されない?
bashの変数の展開がいつ行われるのか? あれ、代入済みなのに反映されない? bashの変数の展開やコマンドの実行の順番の解釈の理解になれば幸いです。 遭遇した問題 $ TEST_A=abc echo $TEST_A 果たして、これは何が出力されるでしょうか?もともとTEST_Aという変数は未定義だったとします。 答え: $ TEST_A=abc echo $TEST_A (何も出力されない)...
View Articleシェルスクリプトのデータ出力タイミングが遅い? それはパイプ通信に起因するバッファリングが原因かもという話
はじめに この記事は「実践!ポータブルシェルスクリプト 〜 シェル関数によるLinuxとmacOSの移植性・互換性問題の攻略方法」の派生記事です。タイトルが長いのでこの記事では「前回の記事」と呼ぶことにします。 前回の記事では、バッファリングによってデータが遅延する問題を解決するためのコマンドの使い方が、Linux (GNU) と macOS (BSD)...
View ArticleS3オブジェクトのARNから、バケット名とオブジェクトキーを抽出するコマンド
目的 S3オブジェクトのARN (例)arn:aws:s3:::example-bucket/example-folder/example-subfolder/example-file.txtから、 バケット名:example-bucket オブジェクトキー:example-folder/example-subfolder/example-file.txt を抽出する。 コマンド...
View Article次期 POSIX (Issue 8) で head -c が標準化されます! 〜 今まではファイルの先頭バイトを取得するのに dd を使えと言っていた
はじめに すみません。嘘つきました。dd コマンドを使えとは言ってないです。POSIX は「head に -c オプションなんてないよ。別のコマンドが使えるよ」って言ってます。別のコマンドってなんやねん! There is no -c option (as there is in tail) because it is not historical practice and because...
View Articleシェルスクリプトで正規表現の照合シンボル[.string.]と等価クラス[=char=]と文字クラス[:classname:]を正しく使う方法
はじめに POSIX で標準化されている正規表現の 照合シンボル [.string.]、等価クラス [=char=]、文字クラス [:classname:] の正しい意味と使い方です。検証は Debian 上で行っています。シェルスクリプト(コマンド)で動作確認していますが、本質的にはロケールの話なので各プログラミング言語にも当てはまるのではないかと思います。 注意 これらはすべて []...
View Articleスクリプトファイル内の任意の関数を呼び出す方法
概要 数多くの関数が入ったスクリプトファイルにおいて スクリプトファイルを編集せずに特定の関数を呼び出す方法 スクリプトファイルの関数 例 以下の内容のA.shというスクリプトファイルがあるとすると A.sh funcA(){ echo "funcAを呼び出しました" } funcB(){ echo "funcBを呼び出しました" }...
View Articleコマンド実行結果やテキストファイルから特定情報を取得するシェルスクリプト
はじめに コマンドの標準出力の結果や、テキストファイルから特定情報を取得するシェルスクリプトを作りました。 シェルスクリプト① apt list --installedコマンドの実行結果から特定情報を抜き出す シェルスクリプト② テキストファイルを読み取り特定情報を抜き出す 1.実行環境 手っ取り早いLinux環境がラズパイだったので、それを使いました。 $ cat /etc/os-release...
View Article[Linux]指定サイズ以上のファイルを検索してファイル分割するシェルサンプル
指定サイズ以上のファイルを検索し、splitを利用して ファイル分割を行うシェルスクリプトサンプルです。 事前準備 ファイル分割テスト用にDDコマンドでファイルを作成します。 bsはブロックサイズ、countは繰り返し数です。 以下の例では10Mの「filename」というファイルを作成しています。 dd bs=10M count=1 if=/dev/zero of=filename...
View ArticleUbuntu 21.10にKindleをインストール
TL;DR sudo apt purge -y 'wine*' \ && sudo dpkg --add-architecture i386 \ && wget -qO - https://dl.winehq.org/wine-builds/winehq.key | sudo apt-key add - \ && sudo...
View ArticleGitコマンドの省略
私は,gitのコマンドでよく使うものを省略して使用しています. 今回は,以下3行を省略して使用する方法を記載します. git add . git commit -m "aaaaを修正" git push origin master ~.bashrc内に以下を追加し,source ~/.bashrcで設定を適用させます. ~/.bashrc function gp () { git add . git...
View ArticleLinuxコマンド(shell) 基本項目
初めに bashにおいて基本的なコマンド、使えるコマンド、よくみるコマンド、コマンドラインで操作していく上で重要なコマンドをまとめました。軽く紹介しているだけなので、それぞれのオプションなどはurlから飛んで確認してみてください。 ls 現在のディレクトリの中身を確認するコマンド //commandディレクトリの中身確認 command % ls # command.txt mkdir...
View Articlegit status って書くのがめんどくさい
何度も↓のタイポをしてイライラしてきました。 terminal $ git statsu git: 'statsu' is not a git command. See 'git --help'. The most similar command is status このイライラを解消するための方法を紹介します。 alias(エイリアス)...
View Articlejps を associative array に格納する
取得 jps.sh JPS=<PATH_TO_JPS>/jps # 宣言 declare -A JPS_ASSOCIATE_ARRAY=(); # jps からの読み込み while read -r a b; do JPS_ASSOCIATE_ARRAY["$a"]="$b"; done < <($JPS) #結果 $ declare -p...
View Article[Bash] Visual Studio Codeにインストールしている全拡張機能をいい感じに一覧出力するシェルスクリプト
動機 vscodeの機能拡張は--list-extensionsオプションで一覧出力できます。 % code --list-extensions AzureADB2CTools.aadb2c bencoleman.armview bmewburn.vscode-intelephense-client esbenp.prettier-vscode...
View Articlexargsによる連番ファイルの並列化(ワンライナー)
xargsで連番ファイルを用意に並列処理できるのでそのメモ。 連番で命名された画像ファイルの一括処理などに利用可能。 ここでは、0001.txt, 0002.txt, ..., 9999.txtを 0001.dat, 0002.dat, ..., 9999.datにリネームする1。 for each in {0001..9999}; do echo $each;done | xargs -P 20...
View Article【Linux】Linuxコマンド基礎
概要 Linuxコマンドでよく使うものを備忘録として載せておきます。 何もない場合は例、$をbash入力、#はコメント及び出力と読み取ってください。 ディレクトリ・パス関連 ルートディレクトリ:ディレクトリの頂点に立ってる場所。「/」で示す。 ホームディレクトリ:ユーザのホームディレクトリ。基本的に「/home/[ユーザ名]」となる。「~/」で示すことも可能。...
View Articleファイルの先頭 N 行と末尾 M 行を取り出すワンライナー
tee を使う方法 $ seq 100000 | nl -s: | tee -p >(head -n 10) >(tail -n 3) > /dev/null | sort -un | cut -d: -f2- 1 2 3 4 5 6 7 8 9 10 99998 99999 100000 処理の流れ 最初に nl -s: で行番号を付けます。次に tee -p...
View Article最新のcommitに入れ忘れた変更を入れ直すコマンド
はじめに 皆さんはGitを使う際、一部変更を入れ忘れてcommitしてしまうことはありますか?私は比較的よくあります。 私はこれまで変更を入れ直す際、git logしてコミットメッセージを取得して、git addして(実際はVSCodeの機能を使うことが殆どなのですが…)、git commit --amend -m...
View Article