今流行りのpecoを使ったシェルコマンドを書いているときに、 xargsが空文字列を受け取ったときの挙動がMacとScientific Linux(以降SL)で違って戸惑った。 echo | xargs echo "hoge" としたときにMacは何もエコーされないのに対し、SLだとhogeがエコーされる。 SLでは-rオプションをつけることで、空文字列が渡ってきたときに無視することは出来るが、Macではエラーになってしまう。 http://linuxjm.sourceforge.jp/html/GNU_findutils/man1/xargs.1.html によれば、rオプションはGNUの拡張らしい。 Macにgxargsが(MacPortsで)入っていたのでこれを使うことにする。
sedがシンボリックリンクを破壊する話 こんにちは、mizuno_asです。 sedは便利ですよね。自動化する際や手順書を作る際、人間が対話的にやらなければならない操作をコマンドで自動化できるのはすばらしいです。 sedには入力元ファイルを上書きする-iオプションが存在します。みなさんも設定ファイルをコマンドラインから書き換えるような際に、よく使うのではないでしょうか。ところがsedの-iオプションはノーケアで使うと、シンボリックリンクを破壊することはご存知でしょうか? Photo via Visualhunt 例として以下のように、テキストファイルにシンボリックリンクを張っておきます。 $ echo hoge > test.txt $ ln -s test.txt link $ ls -l 合計 4 lrwxrwxrwx 1 h-mizuno h-mizuno 8 1月 15 11:57
$ rpm -qi moreutils Name : moreutils Version : 0.49 Release : 2.el7 Architecture: x86_64 Install Date: Fri 29 May 2015 06:34:50 PM JST Group : Applications/System Size : 155340 License : GPLv2 Signature : RSA/SHA256, Tue 04 Mar 2014 12:35:02 PM JST, Key ID 6a2faea2352c64e5 Source RPM : moreutils-0.49-2.el7.src.rpm Build Date : Wed 26 Feb 2014 07:58:44 PM JST Build Host : buildvm-21.phx2.fedoraproj
http://ya.maya.st/d/200703c.html#s20070330_1 出力の順番をいじりたいからといって find | sort | xargs とかやってしまうと -print0 は使えない。ああ困ったねぇ。どうしようもないねぇ。 sort -z なんてオプションがあって、NULL文字も受け付けてくれますよ。 GNUのみっぽいですが。 find . -print0 | sort -z | xargs -0 cmd -- 他にも、ちょっと意味合いが違いますが grep -Z なんてものもあるみたいですね。 出力時にNULL区切りするという。
今まで find と組み合わせてたのだけれども、 GNU chown だと --from というオプションがあることにさっき気づいた。 以下はカレントディレクトリ以下のファイルで 所有者が from_user:from_group なファイルのみ所有者を変更するためのコマンド。 -c オプションを付けて処理の様子を画面に出した方が良いかも。 $ chown -R --from=from_user:from_group to_user:to_group ./ 今までのやり方だと、だいたい以下のような感じ。 オプションとかは適当なのでおそらく動作しない。 最近マスコミで流行ってる、画面はイメージです メソッドを使用した。 $ find . -type f -user from_user:from_group | xargs chown to_user:to_group 実にどうでも良いが、マス
Named Directory という機能があるらしい。 やり方は簡単で、 hash コマンドの -d オプションを利用する。 hash -d 名前=ディレクトリパス 以後、cd ~名前 で移動できるようになる。 たとえば以下のようにすると、 % hash -d test=/usr/local/src こんな感じで移動できるようになる。 % cd ~test ~test% # ここはプロンプトの設定にもよる ~test% pwd /usr/local/src ちなみに、 setopt auto_cd としておくと、 もっと簡単に移動できる。 % ~test ~test% 追記: どうも、hash -d でなくともよく 実際には任意の変数に cd ~変数 とすることでその変数の文字列が指すパスに 移動することが出来るようだ。 したがって、変数なら何でも良いので % src=/usr/loca
Esc + Enter で複数行編集できる % ps aux<ESC><ENTER> ls -al
vim にある Ctrl+A の zsh 版。 zle の incarg 関数 % autoload incarg % zle -N incarg % bindkey '^A' incarg % 100 # press Ctrl+A % 101 # press Ctrl+A % 102 # press Ctrl+A % 103
logrotate の設定ファイルに、 postrotate ~ endscript という項目がある。 これは、ローテート処理を行った後に、 実行したいコマンドを記述する項目である。 大抵、ログファイルを出力しているデーモンアプリに対し、 HUPシグナルを送出し、ログファイルを開き直させるために使用されている。 (デーモンアプリの作り方にもよるが、大抵の場合これを行わないと ローテートした先のファイルにそのまま書き込み続けてしまう。) 今まで知らなかったのだが、 そのときに、実はローテート対象のファイル名を 仮引数として渡してくれていたらしい。 つまり、$1 や $2 などで参照できる。 これは便利だ。 以下は、よくある logrotate の設定ファイルである。 /var/log/logfile1.log /var/log/logfile2.log { daily create rot
zsh % vared PATH どうでもいいけど、zshに bye ってあったのね。 % bye
zsh の カーソル位置までをエスケープしてくれる quote-line(Esc+") に相当する機能が、 bash には無いようだ。(Esc+. とか Esc+/ はあるのに...) というわけで、Bash/bind で実現してみた。 以下の行を、.bashrc に記述。 bind '"\M-\""':"\"\C-a'\C-e'\"" 一応説明しておくと、 Meta-": C-a'C-e' C-a で行の先頭に移動して、' という文字を入力 C-e で行の末尾に移動して、' という文字を入力している。 この方法では、 複数回入力でどんどんエスケープされていく機能に関してはアウトです。
Esc + ドット(.) と入力すると、 直前に入力したコマンドの最後の引数を補完してくれる。 複数回入力する事によって、 過去にどんどんさかのぼっていく。 追記: ブックマークコメントにも書かれてますが、 Esc は、正確には Meta キーです。 さらに追記: 他にも、色々あるようで、 id:hiboma さんの以下のページに非常に詳しく書かれています。 http://d.hatena.ne.jp/hiboma/20061005/1160015116
すごい便利なのを見つけてしまった。 これはいい。 ESC + " と入力する事で、 カーソル位置までをエスケープする事が出来るみたいだ。 たとえば、以下のように文字列を入力した状態で、 $ hello world hello の o の次の位置で ESC + " と入力すると $ 'hello' world とシングルクォートで囲ってくれる。 複数回入力する事で、 $ ''\''hello'\''' world どんどんエスケープしていく。 ESC + $ でこの逆を行う。 $ 'test test' $ test test
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く