タグ

bashに関するtohokuaikiのブックマーク (18)

  • 今どきのシェルスクリプトは数値計算にexprを使わない(POSIX準拠) - Qiita

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

    今どきのシェルスクリプトは数値計算にexprを使わない(POSIX準拠) - Qiita
    tohokuaiki
    tohokuaiki 2022/10/08
    へー。知らんかった。
  • POSIX 準拠のシェルスクリプトでは find | xargs よりも find -exec {} + を使うべき! - Qiita

    POSIX 準拠のシェルスクリプトでは find | xargs よりも find -exec {} + を使うべき!ShellScriptBashshellPOSIX はじめに find の出力を xargs にパイプで渡すというのはよく見かける使い方ですが、find -print0 | xargs -0 が使えない POSIX 準拠のシェルスクリプトでは find -exec {} + を使った方が良いです。安全かつ十分に速いからです。よく見かける -exec {} ; ではなく -exec {} + ですので間違えないようにしてください。多くのケースでは + の方が優れているのですが ; ばっかり使われているのを見ると、意外と知られてない気がします。 少しだけ予備知識として、-exec {} ; は -exec {} \; と ; をバックスラッシュでエスケープするのがよく見る使い方

    POSIX 準拠のシェルスクリプトでは find | xargs よりも find -exec {} + を使うべき! - Qiita
    tohokuaiki
    tohokuaiki 2021/09/14
    ファイル名にスペースあってもxargs -I{} でいけるやん?自分は昔のド素人時代に-execでなくxargs 勧めてたブログ記事読んでからずっとそのまま。
  • bash/zshでsourceされたスクリプト内で、ファイル自身の絶対パスをとるシンプルな記法 - Qiita

    追記: コメント欄にて、若干変なパスが含まれている場合の対処方法について、補足いただきました。 ご指摘ありがとございますm(_ _)m bash / zshなどでシェルスクリプトを書いていると、環境変数の設定を外部ファイルにまとめてsource して使う、というのはよくある。 そのような場合にsourceされたファイル内での絶対パスがイマイチうまく取れない、という問題に突き当たる事がある。 bashの話: うまくいかない方法と理由 通常、シェルスクリプト内で自分自身の絶対パスをとるときによくやるのが下記の手法だとおもう。 が、単体で呼び出した場合にはちゃんと動くのだが、bashからsourceで呼び出した場合にはうまく動かない。 なぜかというと、sourceされたファイルの実行が、呼び出し元のシェルプロセス内になるから。 bashでは$0は実行コンテキストに依らず、実行ファイル名が入ってい

    bash/zshでsourceされたスクリプト内で、ファイル自身の絶対パスをとるシンプルな記法 - Qiita
    tohokuaiki
    tohokuaiki 2021/05/02
    bashなのにPHPerの人達が集まっている…
  • bashの変数をsplitして配列を作る方法

    bashの変数をsplitして配列を作る方法を紹介します。 1.問題点 bashで次のような変数を作成しました。 #!/bin/bash foo=a,b,c,d,f,e,g この変数fooを","でsplit(分割)して配列変数に代入したいのですが、方法がわかりません。 ということで、bashの変数をsplitして配列を作る方法を紹介します。 2.bashの変数をsplitして配列を作る bashの変数をsplitして配列を作るには、文字列置換を利用します。 #!/bin/bash foo=a,b,c,d,f,e,g list=(${foo//,/ }) echo ${list[@]} echo ${list[1]} 実行結果 a b c d e f g b 3.文字列置換について 今回利用したbashの文字列置換のフォーマットは、 ${変数名/置換前文字列/置換後文字列} が基です。

    bashの変数をsplitして配列を作る方法
    tohokuaiki
    tohokuaiki 2020/04/08
    “bashの変数をsplitして配列を作るには、文字列置換を利用します。${変数名/置換前文字列/置換後文字列} が基本で1回のみ置換します。 マッチする文字をすべて置換したい場合${変数名//置換前文字列/置換後文字列}”
  • [小ネタ] mkdir したディレクトリに cd する方法 9 選 +1 (BASH) ※追記あり | DevelopersIO

    $ mkdir /very/_very/Very-long/directory_name/20170915 なんて操作をしたあと、そのディレクトリにcdしたい場合ってまれによくありますよね。 どんなやり方があるか考えてみました。 1. コピペする そのまんまですが、これをやりたくなくてこの blog を書いてます。 2. TAB 補完で頑張る これも無いわけではないですが、間違えたりすることを考えると正直あんまりやりたくないです。 3. 上矢印キーで前コマンドを呼び出し、右矢印キーで先頭に戻ってmkdirをcdに書き直す よく見る方法ですが、もうすこし少ない手数でできないでしょうか。 4. 上矢印キーで前コマンドを呼び出し、Ctrl-Aで先頭に戻ってCtrl-Dx5 のあとにcd BASH のキーバインドはデフォルトだと emacs モードなので、このやり方が出来ます。 でもまだちょっと手

    [小ネタ] mkdir したディレクトリに cd する方法 9 選 +1 (BASH) ※追記あり | DevelopersIO
    tohokuaiki
    tohokuaiki 2017/09/16
    なるほど。shellのこういうの助かる。cd $_ がいいな。
  • さくらインターネットのデフォルトのシェルをbash に変更してみた

    なんかデフォルトはcsh だった さくらインターネットのスタンダードプランでシェルログインしてたわむれていたんですが、シェルがbash じゃないみたいでして。 source $HOME/.bashrc してもCommand not found とか言われちゃうんですよね。 んで、こちらの方法で確認してみたら、どうもシェルがbash じゃなくてcsh みたいで。 それだとちょっと困るんでbash に変えたいよねと。 chsh -s で変更 例によってコマンド一発叩くだけ。 こちらの方法で調べたbash のパスを指定してやればOKでした。 chsh -s 私の場合だと下記の様になりました。 chsh -s /usr/local/bin/bash このあと、パスワードを要求されましたが、さくらのシェルログイン時に使用したパスワードで問題なく変更できました。 いったんexit してシェルを閉じてか

    tohokuaiki
    tohokuaiki 2017/04/12
    “chsh -s /usr/local/bin/bash”
  • 割りと便利だけど微妙に忘れがちなbashのコマンド・チートシート - Qiita

    自分用にメモしておく コマンド実行 CMD1; CMD2, CMD1 && CMD2 ;はCMD1の結果に関わらずCMD2も実行される &&はCMD1の結果が正常な場合のみCMD2が実行される CMD1 || CMD2 - 失敗時に後続コマンドを実行する CMD || printf "%b" "MSG"でエラーメッセージを表示する エラーメッセージ表示後exit 1したい場合 = CMD || { printf "%b" "FAILED.\n" ; exit 1 } CMD || printf "%b" "FAILED.\n" ; exit 1と波括弧無しで書くと期待通り動作しない(CMDが成功時もexit 1してしまう) CMD & - バックグラウンド実行 CMD &で[1] 4592のようにジョブ番号とプロセスIDが表示される killしたければkill %ジョブ番号 か kill

    割りと便利だけど微妙に忘れがちなbashのコマンド・チートシート - Qiita
  • プログラマーの君! 騙されるな! シェルスクリプトはそう書いちゃ駄目だ!! という話 - Qiita

    記事が切っ掛けとなってお声がけを頂き、記事の増補リファイン版となる記事をSoftwareDesign 2018年1月号のシェルスクリプト特集第2章として執筆しました。リファイン版には、この記事で触れていない文法面での分かりにくさについての解説が含まれています。その文法面での分かりにくさの解説の一部に相当する記事もありますので、ぜひそちらも併せてご覧下さい。 Shell Script Advent Calendarをご覧の皆様、図々しくも5日目に続く2度目のエントリーのPiroです。 前回は自作のBashスクリプト製Twitterクライアントをネタに実装を解説しましたが、今日は他の言語で多少のプログラミング経験はあるんだけど、どうにもシェルスクリプトは苦手だ……という人のための、シェルスクリプトによるプログラミングの勘所を解説してみようと思います。多分、プログラミング入門レベルの人や上級

    プログラマーの君! 騙されるな! シェルスクリプトはそう書いちゃ駄目だ!! という話 - Qiita
  • うっかりnohup無しで長時間かかるコマンドを実行したときに後から終了しないようにする - Glide Note

    いつまで経っても終わらないから帰れない… 途中で終了してしまうと困るので、ログアウトしても終了しないように。 作業の流れ Ctrl+Zでコマンドの中断 bgでバックグラウンドに回す jobsでジョブの確認 disownでログアウトしても実行されるようにする 実際のコマンドだと

    tohokuaiki
    tohokuaiki 2015/04/02
    rpmbuild -ba hoge.spec/ # Ctrl+Zで中断 / bg 1 #バックグラウンドにまわす/jobs 1 #ジョブNo.確認 / disown %1 #バックグラウンド処理へ切り替え
  • 間違えてmasterやdevelopにpushしてしまうあなたは今すぐこれを.git/hooks/pre-commitにコピペしなさい - Qiita

    間違えてmasterやdevelopにpushしてしまうあなたは今すぐこれを.git/hooks/pre-commitにコピペしなさいGit #!/bin/bash current_branch=$(git rev-parse --abbrev-ref HEAD) warn_branch() { echo "You can't commit on '$current_branch'!" } case $current_branch in master) warn_branch; exit 1 ;; # Of cource you can add any other important branches as you need. develop) warn_branch; exit 1 ;; # Of cource you can add any other important branch

    間違えてmasterやdevelopにpushしてしまうあなたは今すぐこれを.git/hooks/pre-commitにコピペしなさい - Qiita
  • .bashrc が反映されない件 - たつこの部屋

    root 用に /root/.bashrc (solaris では /.bashrc) を書いた時などに、一般ユーザから su で root になっても .bashrc が反映されないという問題 (?) がありました。 これは、結論からいうと .bash_profile がないだけで、bash のログイン時に読まれるのは .bash_profile であり、.bashrc は .bash_profile から読まれるものなので、.bashrc を読ませたいのなら、.bash_profile に以下の内容を書けばよいです :) % su - # vim .bash_profile source .bashrc ただ、私は zsh ユーザなので、あまり使わないかも… ;)

    .bashrc が反映されない件 - たつこの部屋
    tohokuaiki
    tohokuaiki 2013/07/30
    おおぅ。知らなかった。
  • bashの基礎

    なお、以前に操作したコマンドの履歴を番号付きで表示させるには、history コマンドを使用します。デフォルトでは、1000個まで履歴に保存されます。もし、この数値を変更したい場合は、環境変数HISTSIZEの値を変更します。シェルで、HISTSIZE=500 のように入力すると履歴は500回まで保存されるようになります。変更されたかどうかを確認するには、env コマンドを使用します。なお、入力履歴はユーザーごとに、ホームディレクトリ下に .bash_history というファイルが作成されており、そのファイル内に入力履歴が記録されていきます。なので、システムを再起動したり、停止させたりしても、ホームディレクトリ直下に.bash_historyが存在すればいつでも入力履歴を呼び出すことができます。 ここで、ちょっと余談なんですが、TeraTerm での便利な画面(スクロール)移動について紹

  • bashヒストリのダイエット。bash履歴活用まとめ - それマグで!

    Bashのヒストリをダイエットしました。ダイエットして減った分、よりたくさんのコマンド履歴が確保出来ました。 履歴を確保するとタイプ量が減って仕事早くなるッス。 重複する履歴を保存しない 重複するコマンドは最新一件に限定する。重複は保存しない ~/.bashrc #重複履歴を無視 export HISTCONTROL=ignoredups Ubuntuなら最初から設定してあったように思える。 空白から始めたコマンドを保存しない 履歴に保存したくないコマンドは空白から記述する ~/.bashrc #空白から始めたコマンドを無視 export HISTCONTROL=ignorespace コマンド例 $ □cat /etc/passwd|grep takuya #↑空白入れることで保存されない。 空白を履歴に追記しない、重複履歴を保存しない ignorespaceとignoredupsを同時

    bashヒストリのダイエット。bash履歴活用まとめ - それマグで!
  • bashによるシェルスクリプトの小技(1) - shibainu55日記

    今回から何度かに分けてシェルスクリプト(主にbash)の小技を紹介する予定です。まずは第一弾として、変数の特殊な参照方法を紹介。 変数の特殊参照方法 変数の状態に応じて振る舞いを変える特殊な参照方法。変数に値が設定されていない場合に一時的に値を与えて参照する、などの特殊な参照が可能。知っているとなかなか便利な機能ではあるが、これらをむやみに使用するとシェルスクリプトの可読性が低下し、思わぬバグを生む可能性があるので、あまり多用はしないほうがよさそう。 参照方法 参照結果 ${VAR=aaa} 変数 VAR が未使用の場合に限り、変数VARへ文字列「aaa」を代入し文字列「aaa」を返す。変数VARがNULL値を含み既に使用されている場合は、変数 VAR への代入を行わず、変数 VAR の値を返す。 ${VAR:=aaa} 変数 VAR が未使用もしくは NULL の場合に限り、変数 VAR

    bashによるシェルスクリプトの小技(1) - shibainu55日記
  • bashによるシェルスクリプトの小技(2) - shibainu55日記

    前回(bashによるシェルスクリプトの小技(1))に引き続き、シェルによって自動的に値が設定される特殊な変数について紹介する。特殊な変数を参照することにより、様々な情報を取得することができる(ただし、これらの変数には自分で任意の値を設定することはできない)。 さて、まずは特殊変数を一覧でまとめてみる。お馴染みのものが多いが、最後の2つ(特に最後のPIPESTATUS)についてはきっと今まで知らなかった人もいるんじゃないだろうか。シェルの中でパイプすると途中のコマンドのリターンコード、拾えないとか思っていませんか?今回のポイントとしては、「1. PIPESTATUS変数について」と「2. 特殊変数 $@と$*の違いについて」の2点を主に説明する。 特殊変数一覧表 変数名 自動的に設定される値 $? 直前に実行されたコマンドの終了ステータスが設定される変数。正常終了の場合は「0」、異常終了の場

    bashによるシェルスクリプトの小技(2) - shibainu55日記
  • ウノウラボ Unoh Labs: シェル(bash)スクリプトを書くときのTips

    尾藤正人(a.k.a BTO)です UNIXを使う時にはシェルスクリプトをよく使います。 ちょっとしたコマンドを実行するには、シェルスクリプトは非常に便利です。 今回はシェルスクリプトを書くときに覚えておいた方が便利なTipsを紹介します。 非互換性 ここで紹介するものは基的にbashで動作するものになります。 伝統的なBourne Shellでは動作しないことが多くあると思います。 しかしながら最近はbashがメインで使われることが多いので、"だいだいの環境で動くからおk"ぐらいのノリで使ってもらえればと思います。 $(...) コマンドを"$(", ")"で囲むと実行結果をコマンドラインに代入してくれます。 一見これは"`"(バッククオート)と同じに見えますが、"$()"にはネストができるという利点があります。 例えばシェルスクリプト自身の絶対パスを取得するのは次のようにで

  • シェルスクリプト(Bash)

    シェルスクリプトとはコマンドやシェルの組み込みコマンドなどをファイルに記述し、実行できるようにしたものである。 またプログラムの制御構造なども使用でき、柔軟な処理が可能であり、/etc/rc.d/initd/ディレクトリ内の起動スクリプトなどはシェルスクリプトである。 シェルスクリプトを実行するには実行権限および読み込み権限が必要です。 またシェルスクリプトファイルの1行目にはシェルスクリプトを実行するシェルのパスを記述します。 スクリプトファイル内でも、シェル変数を定義することができる。またその変数を参照する場合は変数名の前に" $ "を 付けることで参照できる。変数名に使用できる文字は英数字および" _ "(アンダーバー)であり先頭は英字を使用しなくてはならない。

  • The Best Keyboard Shortcuts for Bash (aka the Linux and macOS Terminal)

    Bash is the default command-line shell on most Linux distributions, from Ubuntu and Debian to Red Hat and Fedora. Bash is the default command-line shell on Linux, macOS, and most WSL Virtual Machines. It features various keyboard shortcuts for managing processes, controlling the screen, moving the cursor, deleting text, fixing typos, cutting and pasting, capitalizing characters, and using tab comp

    The Best Keyboard Shortcuts for Bash (aka the Linux and macOS Terminal)
  • 1