それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bash

ファイルが作成されてから何秒経っているか?作成後指定秒経過したらなにかする。

ファイルが作成されてから何秒経っているか? このファイルが、作成されてから何秒経過したか。それ知りたいことありませんか? ファイルAがファイルBより古いときはファイルAを更新するとか 作成後(更新後)の経過秒数を知る echo $(( $(date +%s) - $(date…

which コマンドでPATHにある同名のコマンドを全部列挙する

PATH の優先順位に悩まされるたときに which which コマンドを使うと 環境変数 PATH にあるコマンドのうち、最初に見つかったもの(実行されるもの)を表示してくれます。 which python どのコマンドが実行されるのか調べるのに便利ですし、よく使ってると思…

bash で三項演算子っぽく処理を書くには

bash でも三項演算子を使いたい かんたんな、初期値nullチェックとかで三項演算子的なことをよくやります。 bash でもやりたいなと思って調べててみたけど、なかった(あったので追記書きます。)。 条件分岐を使って原始的な手法がsh/bash で使えるのでご紹…

すぐわかる標準エラー出力と標準出力の捨て方( /dev/null へリダイレクト

だれですか ' &1' なんてファイルを作ったのは。 サーバーにログインしてみてたら'1' っていうファイルがあるんですね。1という名前のファイルがあるんですよ。 どう考えても、リダイレクトに失敗してますよね。 標準エラー出力を捨てる速攻で覚えるの書き…

bashのループと数字比較を組み合わせでVPNを接続開始して接続待ち、接続後に処理をする。

bash のサンプルプログラムを考えてた。 よくあるパターンとして、 〇〇を実行して〇〇が△△になるのをまってから、□□する を考えてみた。 VPN の接続を待機する 今回のサンプルはMacでVPNを接続し、接続待ちをし、VPN接続が完了したらルーティングを加える。…

bash の* ( アスタリスクのワイルドカード)でドットファイル(隠しファイル)を一時的にマッチさせる

TL;DR shopt -s dotglob shopt -u dotglob ドットファイルも含めたい時がある。 for i in $ (ls -a) はめんどくさいんだよなぁ ホームディレクトリで、*でワイルドカードマッチさせても一致しないのが不便。 ls -al しているときは気にならないのだけど、一…

$(pyenv init -) が遅いので遅延ロードにした

ターミナルの起動が遅い。 最近、妙にターミナルの起動が遅くて苦痛だなと思って調べたら pyenv 関連だった。 rbenv もそうだったし、pyenv もやはり遅い。 rbenv に関してはrbenv init では諦めて、symlink を使って解決しているが pyenv は別の方法を模索…

bash で mac かどうかを判定する

mac かどうかをbash のif文の条件判定する [[ $(uname) =~ Darwin ]]; echo $? ## または [[ $(uname -a ) =~ Mac ]]; echo $? bash の正規表現ってホント便利 正規表現を使わない場合 bash 以外と bash 3.2 未満は正規表現が使えないので、glob でマッチす…

xargs でシェルのalias を使えるようにする方法。

xargs で alias が使えない takuya@:教科書$ find -type d -maxdepth 1 | xargs ll xargs: ll: そのようなファイルやディレクトリはありません 悲しい。Aliasはあくまで bashのエイリアスであり、シェル経由せずにfork するような場合には全く役に立たない。…

sudo su実行後も環境変数を維持する

suの実行後にカレントディレクトリを維持したい su を実行するとカレントディレクトリが変わってしまうので、いまいるディレクトリやeditor 変数をそのままに 別ユーザーになりたい。 sudo -E を使う sudo にオプションを付ければ、カレントディレクトリなど…

xargsで複数行のコマンドを実行する方法

xargs で複数行のコマンドを実行したい。 出来ない・・・ ls *.txt | xargs -I@ echo @ ; sleep 1 forループならできるんだけど、for ループだとどうしても不便。 xargs でシェルコマンドを作って渡す. xargs だと限界があるので、もうシェルの文字列にして…

画像をpdfに変換する

画像を、PDF(画像埋込)に変換する img2pdf を使ってみる img2pdf のインストール img2pdfは pip で提供されている pythonのコマンドなので pip でインストールする。 pip install img2pdf これで準備出来た。 使ってみる。 ls *.jpg | xargs -I@ img2pdf @…

xargs で実行前に確認のY/Nを実行する interactive

xargs のコマンド実行前に確認する xargs -p これで、毎回確認できる 使ってみた例 takuya@temp$ ls *.jpg | xargs -p -I@ --verbose mogrify -crop 2886x3700+0+0 @ mogrify -crop 2886x3700+0+0 out-000.jpg ?...y mogrify -crop 2886x3700+0+0 out-000.jp…

xargs 実行するコマンドを確認表示してどこまで進んだかを見やすくする

xargs 便利ですよね。 コマンドを明示的に1つずつ実行したり、ファイルをまとめて実行したり。実行する子プロセス数(スレッド)を指定できたり。 まとめて処理しているときにどこまで処理しているかを見ながらやってほしい たとえば、rsync の場合だと rsy…

dateコマンドで unix epoch time の int 秒を取得する

date +"%s" bash を使ってて、今の時間を int 表記でタイムスタンプとしてほしいよねってとき。 takuya@~$ date +"%s" 1538853051 こうすれば、Unix秒、つまり1970 からの経過秒数が取得できる。 知っておくと便利だし。Gnu Date の時刻フォーマットなので、…

sudo で シェルのaliasされたコマンドを使えるようにするけど、環境変数を渡さない。

sudo するとコマンドnot found あああ、、もう。 takuya@sakura:~$ sudo ll sudo: ll: command not found alias に頼り切ってると、こういうことが頻繁に起きる 解決策 alias sudo='sudo ' コレが解決策 間違った解決策: preserve Environment sudo -E 環境…

コマンドで重複ファイルを探す。

重複ファイルを探すコマンド find . -type f -exec md5sum {} + | sort | uniq -w32 -dD find して md5sum にかけて sort したら、uniq を取る 解説 コマンドがズラッと並ぶのでひとつずつ見ていく 現在のディレクトリ以下のエントリ(Dir/File)を列挙 find .…

realpathコマンドがなくても諦めずに、代替コマンドを使う

realpath コマンドが無い。 Ubuntuの最小インストールに、realpath コマンドがなかったんです。まぁalpineとかDockerイメージはちょっと便利なコマンドがなくて苦労する。 相対パスを絶対パスに変換する目的でめっちゃ便利なんだけど readlink でなんとかす…

source したファイルで自身のファイル名$0を知る

source my_bashrc.sh bashの設定を読み込むときに、カレントディレクトリを知りたいというか、実行されている自分自身のファイルを知りたい $0 で取れるだろうと思ったら甘かった。 my_bashrc #!/bin/bash echo $0 source してみる。 $source my_bashrc.sh -…

bashのカレントディレクトリがコマンドとして解釈される問題

謎現象が起きた カレントディレクトリのファイルがコマンドとして実行されてしまう。 takuya@Desktop$ ./a aaaaaaaaaaaaaaaaaaaaaa takuya@Desktop$ a aaaaaaaaaaaaaaaaaaaaaa bash で、このような動的に変化するPATHを認めてしまうと思いもよらない動作を引…

ユーザーのbashrc を読み込まずにクリーン起動する

bash で設定を無効にして起動する。 env -i bash --noprofile --norc bash --noprofile --norc だと環境変数が。。 takuya@$ bash --noprofile --norc bash: takuya_prompt_command: コマンドが見つかりません bash-4.4$ bash: takuya_prompt_command: コマ…

bashでCtrl-Cなどシグナルをトラップ(検出)して終了時の処理を書く

bashで ctrl-C の検出をするには bash でCtr-C の検出をする必要がある利用場面がある。たとえば、時間のかかる処理を書いていて途中で止めたいとか、スクリプトを作っていて中間ファイルを確実に消したいとか、Ctr-Cの強制終了で止めたときに「なにか処理」…

ディレクトリ単位でシェルの環境変数を切り替えるdirenv

npm / rbenv / pyenv みたいな感じの bashenv がほしい。 npm などを ディレクトリ単位で切り替えていると、どうしてもbashrc と整合性が合わなくなる時がある。 そのために、ディレクトリ単位でシェルの設定やエイリアスを切り替えられると便利だよね。 っ…

bashの補完のcompgenでハイフン(ダッシュ/-)の引数を補完する

問題点 -list から -listDevice のようなcompletion が出来なくて、invalid option なっちゃう。 $ networksetup -list<TAB> compgen 無効な引数です キーワードの補完ができない。 ハイフンを付けた引数を補完するときは compgen にハイフンをハイフン( -- )で渡</tab>…

bashでファイルを空にする。コマンド3種類

ファイルを空にしたい フォルダやファイルの構造をそのままに、ファイルの中身を空っぽにしたい。 ファイルを消してtouch すれば良いんだろうけど、パーミッション設定しなおしたり面倒くさいよね。ファイルのinodeも変わってしまうので tail してたら tail …

bashでファイルパスの相対パスを得る(絶対パスの取得やパスの正規化も)/realpath利用

realpath で解決 bashスクリプトで2つのファイルパス間の相対パスを取ろうとすると、計算が大変です。 LinuxもMacもrealpath は入ってないので、 apt/brew でいれる必要があります。 realpath のインストール macOS の場合はhomebrew で GNU Linux coreutils…

シェルのalias されたコマンドの展開する - alias-expand-line

シェルのコマンドを展開したい。 composite 使おうとしたら、候補多すぎて面倒くさい。補完が補完にならないよね takuya@~$ com<tab> comm command compare compgen complete compopt composer composite compress comsat 最初の3文字くらいで、展開されてほしい</tab>…

xargsでリダイレクト> を使う方法

xargs やfind exec でリダイレクトを使うには sh を挟むのが覚えやすくて楽 sh -c ' cmd "{}"> out.txt ' find と xargs の例 find . | xargs -I@ sh -c ' echo "@" >> names.txt ' find . -exec sh -c ' echo "{}" >> names.txt ' 参考資料 https://stackov…

jot コマンドが便利。乱数・連番生成で、ループ処理や文字列生成にとてもいい。

jot コマンドを知りました。 jot コマンドは、連番の数字やアルファベットを生成したり、ランダムな数字を生成したりに使えます。 連番ファイル名などを作るのに大活躍です。 上手に使えば、Bashのスクリプトで seq や $RAMDOM よりも便利かもしれないっす。…

ターミナルで改行とEnterで表示がおかしく異常になった時のなおし方

ターミナルで改行や表示がおかしくなった時 たまにありますよね 。\r \n の改行がおかしくなって、エンターキーで改行しても反映されない時って。 こんな感じに、表示で改行と幅がおかしくなってしまうよね。 takuya@:~$takuya@:~$takuya@:~$ takuya@:~$ tak…