2016-10-10 18 views
0

bashにエイリアスを作成します。ここに「logs」と入力すると最新のログファイルに移動します。私のフォルダは、〜/ logs/date/timeのように構成されています。いつかのためにグーグル後、私は、以下のコマンドを発見し、私はbashプロンプトでbashの.aliasesファイルでコマンドを1つずつ実行します。

cd ~/logs && cd `ls -tr | tail -1` && cd `ls -tr | tail -1` 

しかし、私はそれが.aliases追加して、「ログ」にそれをマップすると予想されるとして、それが動作しないを与える場合には、正常に動作しています。それはログにcdして、私はコマンドを実行する最新のファイル/フォルダにCDを試してみてください。私がFOLDER1にいて「ログ」を実行している場合は、 ログにcdしてから、FOLDER1の最新のフォルダにcdしてみてください。

編集:私のエイリアス定義

alias logs="cd ~/logs && cd `ls -tr | tail -1` && cd `ls -tr | tail -1`" 

私がこの仕事を行うことができますどのようにこの&のように動作している理由を任意のアイデア?

+0

脇に: 'ls -t'は**最新ではない/最も古いファイルを見つける安全な方法です。 [ParsingLs](http://mywiki.wooledge.org/ParsingLs)、[BashFAQ#3](http://mywiki.wooledge.org/BashFAQ/003)を参照してください。 –

+0

...このコードは、あなたのログディレクトリ内の選択されたファイルの名前にスペースが含まれている場合、非常に悪いことになります。 –

+0

ところで、あなたのエイリアス定義自体が*表示されていれば、それは参考になります。この問題から、一重引用符ではなく二重引用符を使用していることは明らかですが、表示されていればそれを推論する必要はありません。 –

答えて

1

エイリアスを定義するときにバッククォートされたコマンドが同時に評価されるという問題があります。

どちらかそれらをエスケープ:

alias logs="cd ~/logs && cd \`ls -tr | tail -1\` && cd \`ls -tr | tail -1\`" 

または単一引用符の式チャールズは(あなたがENVを使用することはできません変数こちら。)コメントとして:

alias logs='cd ~/logs && cd "`ls -tr | tail -1`" && cd "`ls -tr | tail -1`"' 

すぎたり動作している機能を、作成より読みやすいので、チャールズ(もう一度!)が提案したように、簡単に堅牢性を追加することができます(エイリアスを作成するときは、ちょっと速い&ハックジョブを実行してください)。

logs() 
{ 
    cd ~/logs || return 
    cd "`ls -tr | tail -1`" || return 
    cd "`ls -tr | tail -1`" || return 
} 
+0

また、 '||何らかの理由で 'cd〜/ logs'が失敗した場合、カレントディレクトリのサブディレクトリに移動しようとしません。 –

+0

@CharlesDuffy:理由:古い習慣は、あなたがkshで始まったときに大変だ。あなたのコメントで編集しました。 –

+0

(引用符を追加すると、 'ls -tr | tail -1'の不備のためにこれが失敗した場所の数も減ります)。 –

関連する問題