サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
円安とは
qiita.com/ko1nksm
はじめに 多分これはガセネタです。おそらく日本だけで出回っているガセネタです。インタプリタにはそのような定義はありません。インタプリタは「ソースコードを読み込んで意味を解釈して実行するプログラム」 です。「1行ずつ」は些細な間違いとして「機械語に変換する」は完全に間違いです。ある程度詳しい人にとっては常識だと思うのですが。 おそらくコンピュータは機械語しか動かせないから、インタプリタも最終的に機械語に変換しているはずだという間違った思い込みからこのガセネタは広まってしまっているのでしょう。機械語に変換するのは面倒な処理です。速くなるかもしれませんが変換処理しなくて良いのだから普通はしませんよ。 コンパイラとインタプリタの定義 コンパイラとは コンパイラとは、ソースコードを元に実行可能なプログラムを生成するためのプログラムです。ユーザーは(ソースコードではなく)別に生成されたプログラムを実行
はじめに Windows NT は最初のバージョンから POSIX 準拠です。当時の POSIX で標準化されていた POSIX API を実装しており NIST が POSIX 準拠であると認めています。その資料も公開されています。 NIST(National Institute of Standards and Technology)とは、アメリカ合衆国の連邦政府機関の一つで、科学技術に関連する標準についての研究などを行う機関。主に度量衡や計測・計量についての標準を管理したり、関連する科学研究や技術開発を推進している。1988年に前身のNBS(National Bureau of Standards:国立標準局)から改組された。 いつの間にやら某所の Windows に関する POSIX の説明があまりにも酷いデタラメな内容に書き換えられていたので、ここに「1993年から Window
シェルスクリプトが速くなる! forkしない新しいコマンド置換がやってくる!(次期bash/zshの新機能)ShellScriptBashZshkshmksh はじめに シェルスクリプトを遅くする大きな原因は fork と exec です。この二つは OS のインターフェースである fork() 関数と exec() 関数のことで、シェルスクリプトからは、外部コマンドやバックグラウンドプロセスの実行、明示的なサブシェル (...)やコマンド置換 ret=$(...)、パイプの使用などで呼び出されます。 シェル関数はシェルの中で実行される関数であるため、単純にシェル関数を呼び出す場合には fork も exec も行われません。しかしシェル関数の出力を変数に代入しようとコマンド置換(var=$(func))を使うと、exec は行われませんが fork は行われてしまいます。その事に気づかず
シェルスクリプトの関数で「戻り値」を返す方法、全部まとめ(bash/zshの新機能 関数置換・値置換の使用例)ShellScriptBashZshkshmksh はじめに シェルスクリプトのシェル関数の return コマンドは他の言語のような戻り値を返すものではありません。return コマンドで返すものは終了ステータス、つまり 0 から 255 までの数値です。しかし現実には終了ステータス以外の値を返したいというのはよくあります。この記事ではシェル関数から「他の言語でいう戻り値を返す」に相当する方法をすべてまとめました。または次期 bash 5.3/zsh 5.10 で追加される予定の「関数置換 (funsub)」と「値置換 (valsub)」の機能の紹介です。 この記事では現時点で開発中の bash 5.3 と zsh 5.10 に追加される予定の「関数置換」と「値置換」の話を扱って
Windows は 1999年12月(ほぼ2000年なので上記では2000年としています)に発売された Windows 2000 まで POSIX サブシステムを搭載していました。2001年8月に発売した Windows XP では POSIX サブシステムを搭載するのをやめましたが、そのときにはもう米国政府の導入要件ではなくなっていました。POSIX が米国政府の導入要件ではないため POSIX サブシステムをやめたのかもしれません。だからといって Windows が POSIX システムとの互換性を諦めたわけではなく、Microsoft Windows Services for UNIX (SFU) という形で POSIX システムというより UNIX との互換性を実現していました。POSIX だけでは足りないからです。後に SFU は Subsystem for UNIX-based
はじめに 30年以上もの長い間 UNIX を支えてきた Bourne シェルも UNIX のサポート終了とともに消え去ろうとしています。みなさん、他のシェルへの移行はお済みでしょうか? 残り一年、まだ移行が済んでいないという人のために、移行のための簡単なガイドラインと各シェルの特徴をまとめました。 sh は昔は Bourne シェルのことでしたがそれも過去の話です。今どき「Bourne シェル」を解説している記事や sh のことを Bourne シェルと呼んでいる記事は情報が古い(大学関係に多い)、または古い情報を元にして書かれたか、シェルのことを正しく理解してない不正確な記事なので参考になりません。分かりやすい基準ですね。 関連記事 シェルとUNIXコマンドの未来 ~ これからの10年で起きるシェルスクリプトの変化 残り1年というのはどういうこと? Bourne シェルは POSIX に
はじめに シェルスクリプトの世界は今後 10 年で大きく変化します。10 年という数字は切りが良い数字を持ってきただけで根拠はありません。これより長い時間がかかるかもしれませんし、もしかしたら短くなるかもしれません。しかし確実によりよい方向に変わっていくでしょう。Unix/Linux の標準コマンドはさまざまな問題を抱えています。Unix/Linux の標準コマンドに依存している限りシェルスクリプトに大きな改善はありません。これからのシェルスクリプトの世界は Unix/Linux の標準コマンドに依存しない世界です。それがどういうものになるのかをこの記事で解説しています。この記事は私の予言であり目標です。 シェルスクリプトの失われた30年の進化を取り戻す! 残念なことに、シェルスクリプトの世界は 30 年前から大きく変わっていません。それまでの間、プログラミング言語の世界、ソフトウェア開発
マルチライナー記法とは? マルチライナー記法とは、その名の通りシェル芸をワンライナーではなくマルチライナー(複数行)で書くことです。長すぎる行をワンライナーで書くと以下のように横スクロールが必要になって非常に読みにくくなります。(コードは Convert long single line command to a bash shell script より借用。長いコードとして利用しているだけで中身に意味はありません)。マルチライナー記法はこのようなワンライナーを読みやすく書くことです。 nice --20 iperf3 -c somelocation.com -f k | while IFS= read -r line; do echo "$(date) $line"; done | tee onespeed.txt | tee -a speeds.txt; sleep 30 ;cat o
xargs 完全理解マニュアル - xargs は拡張引数 (extended arguments) の略って知っていますか?ShellScriptUNIXシェル芸POSIXUnix哲学 はじめに xargs コマンドは「なにか凄そうだけどよく分からないコマンド」としてよく知られています。使う人は使うけど何をやっているのか全くわからないコマンドです。また、やっていることがわかっても実際に使ってみると、空白やクォーテーション文字でエラーになってしまう使い方がとても難しいコマンドです。この記事はそういうよくわからない xargs はどういうコマンドなのか解説します。この記事を読むと xargs を「完全に理解した」と言えるようになるでしょう。 xargs コマンドが難しい理由は、xargs 自体の設計や実装の問題で古い時代の制限が多いからです。仕様が意味不明で一貫性がなくで他のコマンドと正しく
はじめに readlink コマンドと realpath コマンドは、どちらもシンボリックリンクを解決し、指定したパスの実体がある場所を探すコマンドです。後ほど解説しますが、シェルスクリプトを書くときに非常に重要なコマンドです。 readlink コマンドと realpath コマンドは多くの環境で使えるようになり、POSIX.1-202x (Issue 8) で標準化されました。一般的に標準化は実装された後に行われるため、使ったことがある人は多いでしょう。ほとんどの環境ですでに実装ずみであるため気兼ねなく使えるようになりました。もし古い使えない環境にも対応したい場合には、私が readlink -f と互換性がある readlinkf 関数を作っているので環境が対応するまでそれを使用して時間稼ぎができます。 readlink コマンドと realpath コマンドを使ったことがある人は、
はじめに kill コマンドと trap コマンドはシェルでシグナルの送信と受信を行うためのコマンドです。このコマンドは意外と適切ではない使われ方をよく見かけます。この記事では kill と trap の基礎知識を解説します。 POSIX準拠のkillコマンドの構文 POSIX で標準化されている kill コマンドの使い方は次のとおりです。POSIX で標準化されているというのは移植性が高い書き方ということを意味しています。シグナル名の指定には -s オプションが必要です。そして signal_name であって signal_number でないことに注意してください。POSIX シェルの世界にシグナル番号という概念はありません。シグナル番号を指定した書き方は避ける方をおすすめします。
はじめに set -o pipefail は POSIX で標準化されているシェルオプションです。パイプラインにおけるエラーを確実に検出するために、シェルスクリプトでは基本的に使うようにしましょう。 某コメントより “set -o pipefail は標準化されました” っていってここ何年かの標準化を無邪気に正当化できるのいいなと思う(目の前のターミナルを見ながら) どのシェルを今使っているのか聞きたいですね。商用 Unix を含む主流の環境で、すでに何年(十数年、数十年)も前から set -o pipefail は実装済みなんですが? おそらくシェルの事をよく知らないで言ってるのでしょう。私は標準化の有無は関係なく実際のシェルのことを調べ尽くして言ってるわけで無邪気に正当化とか失礼な話です。標準化とか気にしてるから何年(十数年、数十年)も前に実装された便利な機能が使えないんですよ。自業自
はじめに コマンドをパイプでつなげた時、各コマンドの間にはいくつかのバッファが存在します。そのバッファについてちゃんと意識しているでしょうか? バッファの存在によって各コマンドの実行には分かりづらい変化があります。そのバッファを知らないと罠にハマってしまう・・・かもしれません。 プロセス間のパイプ通信のバッファ まずプロセス間のパイプ通信に存在しているバッファです。多くのコマンドは行単位でデータを処理しますが、一般的にパイプでつなげた各コマンドはそれぞれ処理速度が異なります。処理がすぐに終わるコマンドもあれば時間がかかるコマンドもあります。各コマンドは並列で動作可能ですが必ずしも並列で動作するわけではありません。 一般論としてパイプライン全体の処理にかかる実時間はパイプでつながったコマンドの中で一番遅いコマンドに足を引っ張られます。いくら並列で動作可能と言ってもデータが到着しなければ処理す
はじめに 一般的にファイルの最終行に改行がないデータを扱うのは良い考えとは言えません(よくない理由は別記事で書きます)。しかしそれでも扱いたい場合もあります。この記事ではその方法をまとめました。 この記事は シェルスクリプト&PowerShell Advent Calendar 2023 2日目の記事です。 1. read コマンドで改行がないデータを扱う この read コマンドを使った方法は POSIX で標準化された範囲のシェルの機能とコマンドの中では 最終行の末尾に改行がある場合とない場合を正しく区別できるという点で (おそらく)最も自然な形でシェルスクリプトで最終行に改行がないデータを扱う方法です。 改行がないデータとして扱う ときどき read コマンドは終端に改行が無いデータを読み込めないと言われますが、実はそれは正しくありません。データは読み込んでいるのですが最終行の改行が
sort -u と sort | uniq は同じじゃないよ ~ 文字の順番とロケールとPOSIXと現実の実装のめんどくさい話ShellScriptBashLinuxUNIXPOSIX はじめに sort コマンドの -u オプションは重複行を取り除くオプションです。-u は 1979 年の Vesion 7 Unix のときからある古いオプションで、シェルスクリプトに詳しいと自負している人でこのオプションを知らなければモグリでしょう。uniq コマンドは重複行を取り除くコマンドです。「現在のすべての問題が解決された場合」は sort -u と sort | uniq はほぼ同じになるのですが、実際には異なる結果を返すことがあります。この記事ではその問題について解説します。 前提知識: sort-u と uniq の正しい理解 この記事の話とは少し異なりますが前提知識として sort コマ
はじめに find コマンドの使い方は、ざっくり調べただけではよくわからんとなりますが、見逃しがちなルールを知れば簡単に理解できます。find コマンドに限りませんが使い方を調べるのが面倒だからと曖昧な理解で使うと逆にもっと分からなくなって時間がかかります。急がば回れ、理解して正しく使ったほうがシンプルで楽で簡単です。この記事では find コマンドの使い方を理解するために必要なルールと使い方の実践的な知識をまとめました。 Q&A(?): -type や -perm の説明はしないの? ⇒ それらはドキュメントを読むか検索すればすぐにわかることで難しいポイントではありません。重要なのは基本のルールを理解することです。 関連記事 POSIX 準拠のシェルスクリプトでは find | xargs よりも find -exec {} + を使うべき! 移植性の話はこちら ⇒ findコマンドのオ
link/unlinkはハードリンクの作成・削除コマンド。シンボリックリンク用ではないしファイルも削除する管理者用コマンド。ShellScriptLinuxシンボリックリンクシェル芸UNIXコマンド はじめに unlink コマンドはハードリンクを削除するコマンドです。コマンド名に link と入っているから勘違いしている人がいるようですがシンボリックリンクを削除するために作られたコマンドではありません。unlink コマンドの反対は link コマンドです。 link コマンドはハードリンクを作成します。その反対なので unlink コマンドはハードリンクを削除するコマンドと言って良いでしょう。リンクを削除してどこからもリンクされなくなったファイルは消えるのでunlink コマンドはファイルも削除します。シンボリックリンクファイルもファイルなので削除されます。 link/unlink は
理由 びっくりした。対話シェルで実行してパフォーマンス測定すると何故かめちゃくちゃ時間がかかる。これではデータにならない。 追記 よくよく考えたらパフォーマンス測定だけの問題ではなく実際に遅くなるのだから、対話シェルから「このようなコード」を実行してはいけないということを意味しています。「このようなコード」がどのようなコードなのか発生条件はまだ特定できていませんが、少なくともシェルスクリプトにしていれば問題は発生しません。また bash 以外のシェルでも問題は発生しません。 検証結果が気になった方は、ぜひ試してみて、この話を広めてください。 証拠 実行環境: Ubuntu 22.04.3 LTS、bash 5.1.16
問題 awk で複数のアクションをワンライナーで書いた時、区切りの「;」の数は、0個、1個、2個のうちどれが最も適切でしょうか? 以下の中から適切な回答(複数可)を選び、その理由も答えてください。 # A. セミコロンは不要である echo foo | awk '{print} {print}' # B. セミコロンは一つ必要である echo foo | awk '{print} ; {print}' # C. セミコロンは二つ必要である echo foo | awk '{print} ;; {print}' この記事は上記の問題の回答、およびその回答にまつわる Brian Kernighan と One True Awk、GNU awk との互換性、POSIX awk の標準規格、に関するこぼれ話を紹介する記事です。 . . . ブコメにちゃんと文章読んでるんだろうか?と疑問になるレスが
はじめに 誰もが知っている通り jq コマンドは JSON データを処理するためのフィルタコマンドです。awk コマンドと同じように抽出や編集といったデータ処理を行える専用の言語を備えています。jq コマンドは巨大な JSON データをストリーミングで処理することができる --stream オプションを持っており、データの完全な取得を待たずにデータを受け取りながら処理することが出来ます。しかしその使い方は難しくあまり解説されていません。そこでどのように使うと良いのかを調べてまとめました。 ストリーミング形式の出力 (--stream) まず次のような JSON データを用意しました。 [ {"name": "apple", "price": 210, "count": 10 }, {"name": "banana", "price": 140, "count": 15 }, {"name"
はじめに 2023年、長い時を経て awk がとうとう Unicode (UTF-8) と CSV に対応しました 🎉🎉🎉 awk で日本語がうまく扱えない(場合がある)、Excel が出力する CSV ファイルが扱えない(場合がある)、といった問題が解決に向けて一歩に進みます。 去年、本家 awk (One True Awk, nawk) に Unicode サポートが Brian Kernighan の手によって追加されたと話題になった(参照)ことを覚えているでしょうか? Brian Kernighan が誰だか知らない方がいるかもしれないので説明すると、オリジナルの awk の開発者の一人で awk の頭文字、Alfred Aho、Peter Weinberger、Brian Kernighan の一人です。通称「K&R」の「プログラミング言語C」や「プログラミング言語AWK」
はじめに もう文字列の置換で sed コマンド使うの禁止して良いんじゃないですかね? 言いすぎだとわかってあえて言っていますが。 悪い書き方(外部コマンドに頼る方法) # 変数 line に入ってる文字列を echo コマンドで出力して sed コマンドに渡し、 # sed の s コマンドで "from" を "to" に置換して出力したものを ret 変数で受け取る ret=$(echo "$line" | sed "s/from/to/")
はじめに シェルスクリプトの if コマンドの使い方は覚えるのがとても簡単です。 if の一番単純な構文 if の一番単純な書き方(elif や else がない場合)は次のとおりです。 fi は if を逆に並べたものです。この文法の発想は歴史をたどると C 言語を含む多くの言語に影響を与えた ALGOL から来ており、Bourne シェルの開発者が ALGOL 68 コンパイラの開発に関わっていた影響です。Bourne シェルとは ash や bash や zsh の祖先のシェルで、今はほとんど使われることのない古いシェルの名前です(2025年1月1日でサポート終了する Solaris 10 を除く)。昔は sh = Bourne シェルという時代がありましたが、今は sh = さまざまな POSIX シェルのどれかです。POSIX シェルとは POSIX で標準化されているシェルの仕
$ awk 'BEGIN{print srand() + srand()}'; date +%s 1686750469 ← awk コマンドによる出力(1秒ズレている) 1686750468 ← date コマンドによる出力(date コマンドを使った Unix 時間の取得) $ readlink -f $(which awk) # awk の実体は GAWK /usr/bin/gawk このコードは書籍『「シェル芸」に効くAWK処方箋』で紹介されているコードで、「これは強力! AWKとパイプの新しい関係 ~ 時刻を取得する関数、Socket通信、双方向パイプ」や「第2回 月刊『シェルスクリプトマガジン 2014 November (Vol.19)」にも掲載されているようです。一応 Solaris 10.3 / 11.4 の POSIX awk (/usr/xpg4/bin/awk) に限
はじめに フェアフィールドの公式とは西暦1年1月1日から何日目かを計算する日本でしか知られていない謎の公式です。発表は1949年(?)でツェラーの公式の1882年よりも後です。 365 y + \left\lfloor \frac{y}{4} \right\rfloor - \left\lfloor \frac{y}{100} \right\rfloor + \left\lfloor \frac{y}{400} \right\rfloor + \left\lfloor \frac{306 ( m + 1 )}{10} \right\rfloor + d - 428 ことの始まりは気まぐれに ChatGPT にフェアフィールドの公式を実装させてみようと思い立ったことです。たいして難しい式でもないので実装できるだろうと思っていたのですが、ChatGPT はフェアフィールドの公式を知らないと答え
この中で私が特に気に入ったコマンドは dateround です。次点は dategrep です。この二つは特に強力で、awk やその他のコマンドを使って日時をこねくり回すような「無駄に難解なコード」を書かずに Dateutils のコマンド群だけで大抵のことはなんでもできてしまいます。専用のことをするには専用のコマンドを作ることが重要であることを思い出させてくれるでしょう。 Dateutils の重要な特徴と使用例 大抵のコマンドは機能の説明から想像できると思いますし、公式サイトにも例があるので詳細を一つ一つ説明することはしません。その代わりに「Dateutils の使いこなしに必要な考え方」が分かるような例をいくつか紹介します。 重要な注意点ですが Dateutils はロケールをサポートしていますが、原則としてシステムのロケール情報やユーザーの環境変数には依存していません。内部にロケー
はじめに この記事は type, command, which 等を用途で使い分けたい人のための記事です。関連がある hash、whence、where や紛らわしい whereis、whatis、what についても解説しています。これらのコマンドは、コマンドの存在チェックでよく使われますが、本来の用途というものがあるわけでその違いと実際のシェルでの実装の注意点を解説しています。速度に関しては「Bashでコマンドの存在チェックはwhichよりhashの方が良いかも→いやtypeが最強→command -vも」ですでに記事があるので特に調べませんが、個人的には「シェルビルトインコマンドの方が速い」という考え方だけで十分だと思っています。 補足 この記事の Bourne シェル とは Solaris 10 の /bin/sh のことです。その他の(商用)UNIX の Bourne シェルでは
シェルスクリプト用の国際化ライブラリの決定版! sh-i18n を作りました ~ gettext.sh 代替・すべてのPOSIXシェルと環境に対応ShellScriptBash国際化GettextPOSIX はじめに POSIX 準拠でどの環境でも動くシェルスクリプト用の国際化ライブラリ sh-i18n を作りました。同様のライブラリとしては GNU gettext に含まれている gettext.sh が有名です。すでにライブラリがあるのになぜ作ったのかと言えば、gettext.sh は基本的に GNU gettext 専用で、書きづらく単一の書き方でどのシェルどの環境でも動くわけではなかったからです。一言で言えばすべての環境で動く完璧なシェルスクリプト用の国際化ライブラリを作りたかったのです。 ちなみにすべての環境で動くというのはおそらく嘘です。動かない環境は今のところ認知していません
次のページ
このページを最初にブックマークしてみませんか?
『@ko1nksmのマイページ - Qiita』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く