2017-02-09 13 views
0

次のコマンドがbshではなくcshモードで動作する理由を教えてください。最新のディレクトリまたは最も古いディレクトリに変更する - cshイディオムがbashで動作しない

バッシュ:CSHに変更した後

~ $ cd `ls -ltr | grep ^d | tail -1 | awk '{print $9}'` 
bash: cd: synopsys_cache_L-2016.03-SP5: No such file or directory 
~ $ pwd 
/home/mkumar 

lsis innately bug-proneを解析に依存している

~ $ csh 
CSH > cd `ls -ltr | grep ^d | tail -1 | awk '{print $9}'` 
CSH > pwd 
/home/mkumar/synopsys_cache_L-2016.03-SP5 
+2

'ls'の出力に依存するロジックを構築することは非常に悪い考えです。 – codeforester

+0

また、私は 'cd ls -ltr | grep^d |テール-1 | awk '{print $ 9}'はこれまでどおり動作します。あなたが 'cd $(cd ls -ltr | grep^d | tail -1 | awk '{print $ 9}')'を意味するかもしれません。 – codeforester

+0

@codeforesterそれは単なる質問の書式設定の問題でした。 – chepner

答えて

3

コード。それをしないでください。

以下は両方cd_newestcd_oldest機能を構築するために同じコードを再利用して、少し空想を取得します。

ここ
cd_by_test() { 
    local test=$1 dir best_dir= 
    shift 
    (("$#" == 0)) && set -- */ 
    for dir; do dir=${dir%/} 
    [[ -d "$dir" ]] || continue 
    [[ $best_dir ]] || best_dir=$dir 
    [ "$dir" "$test" "$best_dir" ] && best_dir=$dir 
    done 
    if [[ $best_dir ]]; then 
    cd "$best_dir" 
    else 
    echo "No directory found" >&2 
    fi 
} 

cd_newest() { cd_by_test -nt "[email protected]"; } 
cd_oldest() { cd_by_test -ot "[email protected]"; } 

、我々はそれを変数に代入することにより、2つの2つのファイルを比較に使用する演算子を設定していますcd_by_testファンクション内の$test、次に[ "$dir" "$test" "$best_dir" ]を使用してその演算子を適用します。最近改訂版で


、我々はまた、ディレクトリの特定のサブセットの間で選ぶことができます。

cd_newest *-test.d/ 

...最新*-test.dディレクトリにcdます。

+0

ありがとうございます:-) –

+0

ちょうど興味深い:なぜ 'dir'から'/'を取り除くのですか? – chepner

+0

純粋に個人的な美的感性、 'set-x';何もそれに魅力的ではありません。 –

2

の迷惑プラグ(csh以外のシェルに移動したい場合は、zshを検討することをお勧めします)。 *

% cd *(/om[1]) 
% pwd 
/home/mkumar/synopsys_cache_L-2016.03-SP5 

括弧は、修飾子種々グロブを含む:

  • /、ディレクトリにマッチを制限
  • [1]のみ最初の一致
  • を選択する修正時刻によって膨張
  • omをソート
+1

私がzshのために持っているのと同じくらい個人的な嫌悪感は、それは*かわいいです。 :) –

+0

@chepnerがDuffyの魔法を説明して以来、今すぐUpvoted! – codeforester

関連する問題