bash

READLINE_LINE 変数ではまる

keyamb.hatenablog.com ココらへんを参考に、peceでhistoryをいい感じにしてみた。 しかし、 READLINE_LINE を読めるものの、上書きできずハマっていた。 どうも、sdkmanが悪さしているようだった。 .bashrc の最後で sdkman-init.sh を実行していたのだが、…

まだまだbash初心者だった…

macでechoの出力に色付けたいのに付かない! coreutils入れたのに! と悩んでたら、なんと、echo は bash builtin にもあり、フルパス指定するかaliasしないとbuiltinが使われるということを今更知った… コマンドを探す優先順位はこちら。 “応用力”をつける…

process substitution は bash とかでないと使えないぽい。

shebang に #!/bin/sh と書いてたり、 sh hoge.sh とかで実行した際、ときどきbash以外のshellが起動されるのか、process substitution のコードがエラーになることがある。 #!/bin/bash とか bash hoge.sh とかすると動いた。

bashの関数はwhichコマンドしても出処が分からない

which や whereis でコマンドのパスが出ないんで「なんだろうな?」と思ったが、よく考えたら .bash_profile で定義しているbash関数だった。 関数の定義は以下で確認できる。 declare -f [function name]

bashのfor分で数値の範囲を指定する方法。

知らんかった… $ for i in {1..10}; do echo $i ; done 1 2 3 4 5 6 7 8 9 10 更にゼロパディングしたい場合は、 $ for i in {01..10}; do echo $i ; done 01 02 03 04 05 06 07 08 09 10

readline のキーバインドの指定方法 (inputrc の書き方)

hogem.hatenablog.com /etc/inputrc の書き方が前から謎だったのだが、emacs風の指定の仕方ができるらしい。 例えば、 $if mode=emacs … "\C-d": kill-word $endif のように、「"\C-d": kill-word」というのを入れたら、Ctrl+d すると単語単位で削除できるよ…

変数の値を while read で読み込んでループ

#!/bin/sh CONF=$(cat<

process substitution て入れ子も可能

$ cat <(cat <(echo hoge)) hoge なんてことをふと思いついて試してみた今日のお昼前。

(よく分からじ…)inputrc のキーバインド設定

gitbash で"ctrl+→、←"を forward-word、backward-word に割り当てたかったんだが、linuxだとこれでいくのか? https://github.com/spring-projects/spring-shell/issues/53 gitbash では効かず…ちなみに、\e[1~ みたいな記法の意味を調べてみたんだが、ここ…

shellモジュールでエラーをtrapした時のLINENO 変数はモジュールでの行番号

shellのモジュールでエラーが発生した時、 trap して LINENO 変数とか参照すると、モジュールでの行数とか出てきて分かりづらい。 なんかいい手は無いのかな?実行中のファイルを参照できる変数とかないのか?($0だと親シェルのファイル名が出る)test.sm t…

set -e とか trap とかしても、エラーコード返さなきゃ拾えない。

例えば #!/bin/sh set -e echo hoge | error | : echo "Couldn't catch error." を実行すると、 sh test.sh test.sh: line 5: error: コマンドが見つかりません Couldn't catch error.trapしても #!/bin/sh trap 'echo "Error at line ${LINENO}. Command: $…

getopts でロングオプションを取る

getoptsではロングオプションは使えないということになっているが・・・ while getopts "\-:" opt do case $opt in -) # long options case $OPTARG in help) print_help;; *) echo "unknown option: $OPTARG"; exit 1;; esac;; ?) if [[ $opt = "?" ]]; the…

sudo はデフォでは環境変数は引き継がない!

いつの頃からか sudo するとデフォでは環境変数がクリアされるようになったらしい。 sudo -Eとすれば実行時の環境変数が引き継がれる。ちなみに、環境変数の確認のために sudo echo $hogeとかやって、事前にexportしてた中身が見れたものだから「引き継がれ…

パイプ->while read でエラーハンドリング

command | while read … do cmd1 if [ $? -ne 0 ]; echo "error!" exit 1 fi done とかやってもexitしてくれないし、retrun 1 とかしても return してくれない。 whileループが子プロセスで実行されるかららしい。しかし、exit とか return すると、ループの…

やたらとIFS変数変えるとマズい件

タブ区切りでスペース含むカラムがあるファイルを処理したくて、 IFS=$'\t' while read ・・・ do ・・・ done < filename とかやってたら、 cmd="command --opt" $cmd ${params} とかした時に、cmd内のスペースも丸ごと一つの文字列と扱われてしまい、「"co…

コマンド出力をローカル変数に代入する際のエラーコードチェック

皆さん、bashでよく result=`command` ret=$? みたいにしてエラーハンドリングされてると思いますが、もしこれが関数内で local result=`command` ret=$? みたいにしたらどうなると思います? 実は、$? は必ず0になってしまうのですよ!! local がコマンド…

bash コーディング規約

基本、以下に準ずる。シェル/コーディング規約 - techmemo http://sya.cswiki.jp/index.php?%E3%82%B7%E3%82%A7%E3%83%AB%2F%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E8%A6%8F%E7%B4%84シェルスクリプト Tips - UNIX & Linux コマンド・シェ…

trap コマンドで status code をとることはできないぽい。

また、status code は trap する前の status code になるらしい。 $ cat test.sh trap "echo \"exit code: $?\" " EXIT fuga $ ./test.sh ./test.sh: line 3: fuga: command not found exit code: 0 $ echo $? 127 $また、trap で実行するコマンドでエラーが…

while read の内容を配列に読み込む

こんなんできんのや・・・知らんかった・・・while read -a arrayで各カラムを配列に代入できるそうな。ついでに見つけたんだが、bash4は連想配列が導入されたりと、bashも進化を続けているらしい。時々、調べながら仕事したほうがいろいろ改善できそう。

コマンド実行結果を while read する場合の注意点

some_command \ while read line do (do something) result=(some variable) doneecho $result上記のようなコードを実行すると、最後の行の「echo $result」の実行結果は必ずNULL(空行)になってしまう。 おそらく、some_command とともに、while read の部…

CentOS 6 (というか bash 4) の謎仕様

スクリプトの中でsource env.confみたいに書くと「ファイルがない」と怒られる。source ./env.confとしないとダメ。 コマンドラインでは前者でも通るのに・・・

bash の read に関するイマイチな仕様

■bash の read で空文字のカラムがある場合、そのカラムの存在は無視され、右から詰められてしまう。 例えば、while read col1 col2 col3 ・・・のようなスクリプトが標準入力からhoge\t\tfugaのようなレコードを受け取った場合、 col1="hoge", col2="", col…

bash のexec

bash のexec は、プロセスをforkするのではなく、そのプロセスの中でコマンドを実行する、と・・・ 始めて知った・・・ スクリプト書いてる時、いろいろとエラーハンドリングとかで困ってたの、これ使えば解決できたかも・・・

bash の expr が使える。

数値演算だけでなく、パターンマッチングや文字列の長さの取得にも使える。 詳しくはman pageを。

シェルスクリプトの条件評価ではまりやすいところ

ちゃんと書いているつもりなのに、「unary operator expected」とか「test: too many arguments」 のようなエラーが出る。・条件式に変数を使っていて、その変数がNullだとこのようなことが起きる。 つまり、 while [ $hoge -ne 10 ] みたいな式で、$hogeがn…