4

コマンドの結果をシェルスクリプトの変数に保存したいと思います。私はそれを機能させることができないようです。ディレクトリ内の最新の日付のファイルが必要です。

PRODUCT= 'ls -t /some/dir/file* | head -1 | xargs -n1 basename'

動作しません

4

5 に答える 5

5

$またはバックスティックの2つのオプションがあります`

1)x=$(ls -t /some/dir/file* | head -1 | xargs -n1 basename)

また

2)x=`ls -t /some/dir/file* | head -1 | xargs -n1 basename`

echo $x

編集:(2)の不要なブラケットを削除します。

于 2013-01-28T18:20:32.477 に答える
4

あなたが抱えている問題は、コマンドを一重引用符ではなくバックティックで囲む必要があるということです。これは「コマンド置換」として知られています。

Bashを使用する$()と、コマンド置換に使用できますが、これはすべてのシェルで使用できるわけではありません。KSHで利用できるかどうかはわかりません。そうである場合、おそらくすべてのバージョンで利用できるわけではありません。

$()構文がご使用のバージョンのkshで使用できる場合は、必ずそれを使用する必要があります。読みやすくなります(バックティックは一重引用符と混同しやすいため)。バックダニも入れ子になりにくいです。

ただし、これはコマンドの問題の1つにのみ対処します。lsファイルだけでなくディレクトリも返すため、指定されたディレクトリで変更された最新のものがサブディレクトリである場合は、それが表示されます。

ファイルのみを表示したい場合は、次のバージョンを使用することをお勧めします(デフォルトの変数をサポートするBashを使用しているので、おそらくの構文を試してみる必要があります$1

lastfile () 
{ 
    find ${1:-.} -maxdepth 1 -type f -printf "%T+ %p\n" | sort -n | tail -1 | sed 's/[^[:space:]]\+ //'
}

これはディレクトリでfindを実行し、そのディレクトリからファイルをプルするだけです。すべてのファイルを次のようにフォーマットします。

2012-08-29+16:21:40.0000000000 ./.sqlite_history
2013-01-14+08:52:14.0000000000 ./.davmail.properties
2012-04-04+16:16:40.0000000000 ./.DS_Store
2010-04-21+15:49:00.0000000000 ./.joe_state
2008-09-05+17:15:28.0000000000 ./.hplip.conf
2012-01-31+13:12:28.0000000000 ./.oneclick

リストを並べ替え、最後の行を取得し、最初のスペースの前にあるすべてのものを切り取ります。

于 2013-01-28T18:16:40.107 に答える
1

名前にスペースが含まれている場合でも、後で複数のファイルが必要になった場合に備えて、名前を保持するには両方の引用符が必要です。また、「$(..)」でコマンドをバックグラウンドで実行する必要があります。

lsには「-1」オプションも必要だと思います。そうしないと、1行に複数の名前を付けることができます(1行だけ保持しますが、複数のファイルになる可能性があります)

PRODUCT="$(ls -1t /some/dir/file* | head -1 | xargs -n1 basename)"

"="変数の割り当て(ここで他のソリューションで見たように)の周りにスペースを入れないでください。互換性もあまりありません。

于 2013-01-28T18:22:18.677 に答える
1

一重引用符ではなく、$()( preferred ) またはバッククォート (``) (古いスタイル) が必要です。

PRODUCT=$(ls -t /some/dir/file* | head -1 | xargs -n1 basename)

また

PRODUCT=`ls -t /some/dir/file* | head -1 | xargs -n1 basename`
于 2013-01-28T18:16:23.433 に答える