質問: ファイルが存在するデバイスを見つける(そしてそれをスクリプトで使用する)方法は? スクリプトで使用できるように、ファイルがどのデバイスにあるかを調べたいと思います。私はここまで到達できます:$ df . filesystem 512-blocks used available capacity mounted on /dev/disk0s2 498438976 294369520 203557456 60% / しかし、この出力は不器用に感じます。これを解析して2行目の最初の「単語」を取得するよりも良い方法はありますか?私が本当に必要としているのは、次のコマンドにパイプできるように、次のようなものです。$ somecommand . /dev/disk0s2 できれば「df」出力を文字列ハッキングすることなく、これをどのように達成できますか?
回答: シェルだけでそれを行うことができます(bash、dash、ksh、zshで動作します):df . | (read a; read a b; echo "$a") または、出力が不要で(結果は$ aに保持されます)、シェルがプロセス置換をサポートしている場合(bash、zshなど):{ read; read a b;}< <(df .) そして、他のソリューションの速度との比較を次に示します。# pure shell solution 1 bash-4.2$ time for i in $(seq 500); do df . | (read a; read a b; echo "$a"); done > /dev/null 1.899 (dash) $ time -f '%e' dash -c 'for i in $(seq 500); do df . | (read a; read a b; echo "$a"); done > /dev/null' 1.05 (ksh) $ time for i in $(seq 500); do df . | (read a; read a b; echo "$a"); done > /dev/null 0m1.16s real 0m0.02s user 0m0.12s system (zsh) manatwork% time (for i in $(seq 500); do df . | (read a; read a b; echo "$a"); done > /dev/null) 1.51s # pure shell solution 2 bash-4.2$ time for i in $(seq 500); do { read; read a b;}< <(df .); done 1.192 (zsh) manatwork% time (for i in $(seq 500); do { read; read a b;}< <(df .); done) 3.51s # other solutions bash-4.2$ time for i in $(seq 500); do df . | tail -1 | cut -f 1 -d " "; done > /dev/null 1.405 bash-4.2$ time for i in $(seq 500); do df . | sed '2!d' | awk '{print $1}'; done > /dev/null 5.407 bash-4.2$ time for i in $(seq 500); do df . | sed -n '2{s/ .*$//;p}'; done > /dev/null 1.767 bash-4.2$ time for i in $(seq 500); do df . | sed '2!d' | awk '{print $1}'; done > /dev/null 3.334 bash-4.2$ time for i in $(seq 500); do df . | gawk 'nr==2{print $1}'; done > /dev/null 3.013 bash-4.2$ time for i in $(seq 500); do df . | mawk 'nr==2{print $1}'; done > /dev/null 1.747 bash-4.2$ time for i in $(seq 500); do df . | perl -nae 'print$f[0]if$.==2'; done > /dev/null 2.752 (ここでは機能しないため、statソリューションとは比較されません。)