タグ

ブックマーク / qiita.com/ko1nksm (11)

  • POSIXシェルスクリプトではwhichではなくcommand -vを使うべき理由(+シェルスクリプト版which) - Qiita

    重要 2022-01-30 追記 この記事で解説していた警告の出力は 2022-01-21 に取り消されました(参照 Revert deprecation of which)。そのため Debian which が GNU which に変わることは(少なくとも近い未来では)ないと思います。しかしながら which を使うよりは POSIX で規定されている command と type を使う方を推奨します。 はじめに which コマンドはシステムにインストールされてるとは限りません。実際に最小構成でインストールされてない環境として CentOS があります。一方 command -v は POSIX 規定されているので POSIX に準拠したどのシェルでも問題なく使えます。シェル上では which コマンドを使っても良いと思いますが、シェルスクリプトでは command -v を使う

    POSIXシェルスクリプトではwhichではなくcommand -vを使うべき理由(+シェルスクリプト版which) - Qiita
  • シェル芸の可読性を向上させるマルチライナー記法のススメ - Qiita

    マルチライナー記法とは? マルチライナー記法とは、その名の通りシェル芸をワンライナーではなくマルチライナー(複数行)で書くことです。長すぎる行をワンライナーで書くと以下のように横スクロールが必要になって非常に読みにくくなります。(コードは 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

    シェル芸の可読性を向上させるマルチライナー記法のススメ - Qiita
  • findコマンドの使い方を簡単に理解するための7つのルール+実践的な知識 - Qiita

    はじめに find コマンドの使い方は、ざっくり調べただけではよくわからんとなりますが、見逃しがちなルールを知れば簡単に理解できます。find コマンドに限りませんが使い方を調べるのが面倒だからと曖昧な理解で使うと逆にもっと分からなくなって時間がかかります。急がば回れ、理解して正しく使ったほうがシンプルで楽で簡単です。この記事では find コマンドの使い方を理解するために必要なルールと使い方の実践的な知識をまとめました。 Q&A(?): -type や -perm の説明はしないの? ⇒ それらはドキュメントを読むか検索すればすぐにわかることで難しいポイントではありません。重要なのは基のルールを理解することです。 関連記事 POSIX 準拠のシェルスクリプトでは find | xargs よりも find -exec {} + を使うべき! 移植性の話はこちら ⇒ findコマンドのオ

    findコマンドの使い方を簡単に理解するための7つのルール+実践的な知識 - Qiita
  • 問 awk をワンライナーで書く時のアクション区切りの「;」の数は0個? 1個? 2個? + こぼれ話 - Qiita

    問題 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 の標準規格、に関するこぼれ話を紹介する記事です。 . . . ブコメにちゃんと文章読んでるんだろうか?と疑問になるレスが

    問 awk をワンライナーで書く時のアクション区切りの「;」の数は0個? 1個? 2個? + こぼれ話 - Qiita
  • 【脱sed】いい加減シェルスクリプトで文字列をsedで置換するなんてやめよう - Qiita

    はじめに もう文字列の置換で sed コマンド使うの禁止して良いんじゃないですかね? 言いすぎだとわかってあえて言っていますが。 悪い書き方(外部コマンドに頼る方法) # 変数 line に入ってる文字列を echo コマンドで出力して sed コマンドに渡し、 # sed の s コマンドで "from" を "to" に置換して出力したものを ret 変数で受け取る ret=$(echo "$line" | sed "s/from/to/")

    【脱sed】いい加減シェルスクリプトで文字列をsedで置換するなんてやめよう - Qiita
  • 初学者のための正しいシェルとカーネルの概念 ~ 大学も技術者認定機関も間違いだらけ - Qiita

    なんだろう、嘘つくのやめてもらっていいですか? 大学も技術者認定機関も、いつまで古いまたは間違ったシェルとカーネルの概念を説明し続けるのでしょうか? シェルはカーネルの言葉をユーザーの言葉に翻訳したり、出力結果をユーザーに中継したり、カーネルを防御したりする層ではありません。指定したコマンドを実行するだけのプログラムです。勉強中の学生か代理執筆業者が適当な文献を調べて書いたとしか思えません。そして他人の説明を自分の言葉に置き換えるのが上手い人がおかしな説明をさらに広めています。個人サイトやオンライン学習サイト程度であれば適当なことを書いていても気にも留めませんが、大学や技術者認定機関のような正しいことを書いているに違いないと思えるような所までもが間違ったことを書いているから困ったものです。 みなさんは大学や技術者認定機関が言っていることなら正しいと思いこんでいないでしょうか? そんなことあ

    初学者のための正しいシェルとカーネルの概念 ~ 大学も技術者認定機関も間違いだらけ - Qiita
    John_Kawanishi
    John_Kawanishi 2022/12/13
    「シェル」と「カーネル」って名前に引きずられるのかなぁ
  • 今どきのシェルスクリプトは数値計算にexprを使わない(POSIX準拠) - Qiita

    はじめに 1992 年に POSIX でシェルが標準化されて以来、シェルスクリプトの数値計算に expr コマンドは使いません。expr コマンドを使って計算していたのは Bourne シェル(古い UNIX の sh)時代の話で、現在の POSIX sh (dash、bash、ksh 等)時代では数値計算に expr コマンドは不要です。今どきはシェルの機能だけで整数の計算を行うことができます。「今どき」って一体いつからだって話なわけですが……。 注意 シェルスクリプトでパフォーマンスの話をするとすぐに「他の言語で〜」という方がいますが、私はどんなことにでもシェルスクリプトを使えなんて一言も言っていません。パフォーマンスを気にしている理由は、そこが実際にシェルスクリプトのボトルネックになるポイントだからです。そもそもシェルスクリプトと一般的な言語は言語設計レベルで得意なことが違います。ユ

    今どきのシェルスクリプトは数値計算にexprを使わない(POSIX準拠) - Qiita
  • シェルスクリプトで安全簡単な二重起動防止・排他/共有ロックの徹底解説 - Qiita

    はじめに シェルスクリプトで二重起動防止やロックをする方法を検索すると、いろいろな方法や書き方が見つかりますが、どれを使えばよいのか、当に正しく動くのか、不安になりますよね? ディレクトリ (mkdir) やシンボリックリンク (ln) を使った独自実装の例も見かけますが、エラー発生時や予期せぬ電源断、CTRL+C で止めたときなどでも問題は発生しないのでしょうか? まず、ディレクトリやシンボリックリンクを使った独自実装はしない。これを肝に銘じてください。シェルスクリプトでのロック管理はとても難しく、一般的な排他制御の知識に加えて、シェルスクリプト特有の問題、シグナルやトラップ、サブシェルや子プロセスの問題、さらには特定のシェル固有の仕様やバグなどさまざまな問題に対処する必要があり大変です。独自実装の例では古いロックファイルが残ってしまい、それをいつどのタイミングで片付ければ安全なのか?

    シェルスクリプトで安全簡単な二重起動防止・排他/共有ロックの徹底解説 - Qiita
  • POSIXコマンドは「どの環境にもあるコマンド」ではないよという話 - Qiita

    はじめに POSIX コマンドはどの環境にもある(追加インストールの必要がない)コマンドだと思われがちですがこれは間違いです。POSIX コマンドにどの環境にもあるという性質は有りません。POSIX コマンドの中でどの環境にもあるコマンドは実際には半分程度しかありません。 関連記事 POSIX準拠 とは当はどういうことなのか?「POSIXで規定されたものだけを使う」ではありません 補足 Linux は POSIX に準拠してないからだという意見もあるかとは思いますが、現実に使われている環境を無視して「どの環境にもある」と主張しても意味はありません。 当にどの環境にもあるコマンドとは? 全 POSIX コマンドは 160 個 POSIX コマンドは全部で 160 個あります。そのうち 22 個はシェルにビルトインされているコマンドなのでどの環境にもあると言えます。残りは 138 個のコマ

    POSIXコマンドは「どの環境にもあるコマンド」ではないよという話 - Qiita
    John_Kawanishi
    John_Kawanishi 2022/03/27
    [POSIXcomandは必ずInstallされていなければならないとはPOSIXで決まっていません」「この記事の範囲における罠はcommandがないから動かないというだけで」「POSIXcomandの非互換性の方がInstallするだけでは解決しないのでもっと大
  • シェルスクリプトは ((i=i+1)) ではなく i=$((i+1)) で計算しなければいけない!という話 - Qiita

    count=0 max=5 while ((count < max)); do # (( 算術式 )) は条件文で使うものです count=$((count + 1)) # 計算したいだけなら算術式展開を使います echo "$count" done ついでに言うと (( 算術式 )) は POSIX シェルで規定されていません。bash、ksh、mksh、zsh では使えますが dash、yash などの純粋な POSIX シェルに近いシェルでは使えません。 なぜ? (( 算術式 )) を使って変数に値を代入したり変更することができますが、それだけのために使ってはいけません。if や while などの条件文とともに使うものです。 C 言語を使ってる人なら比較的見かける書き方だと思いますが、(( 算術式 )) で値を変えるというのは、以下のように評価するついでに値も変えちゃえと、短く書く

    シェルスクリプトは ((i=i+1)) ではなく i=$((i+1)) で計算しなければいけない!という話 - Qiita
  • シェルスクリプトの変数はダブルクォートしなければいけない!という話 - Qiita

    TL; DR 変数をダブルクォートしない使い方は上級者向けの危険な機能です! $@ と $*(または配列の全要素)をダブルクォートしない使い方は知る必要すらありません! ShellCheck を導入すれば誰でも簡単に正しい書き方がわかります!! 2021-08-21 補足 この記事は dash や bash などの POSIX シェルの一般的な動作を解説しており zsh のデフォルトとは異なります。記事の中でも説明していますが zsh の場合はシェルのオプションを変更することで POSIX 準拠の動作に変更することができます。zsh に関しては後半の「zsh に関する注意点」も参照してください。 はじめに プログラミング言語は、言語によって記号の意味が異なることがよくあります。クォーテーションマークはその一つです。C 言語ではシングルクォートは文字リテラル(一文字)を意味し文字列はダブルク

    シェルスクリプトの変数はダブルクォートしなければいけない!という話 - Qiita
  • 1