3

最初の zsh 完了スクリプトを作成しようとしています。この場合はコマンド netcfg 用です。

不自由に聞こえるかもしれませんが、最初のハードル、免責事項に固執しています。これを大雑把に行う方法は知っていますが、これを行うための「ZSH WAY」を探しています。

/etc/networking 内のファイルを一覧表示する必要がありますが、ディレクトリ コンポーネントではなくファイルのみを一覧表示する必要があるため、次のようにします。

echo $(ls /etc/network.d/*(.))

/etc/network.d/ethernet-dhcp /etc/network.d/wireless-wpa-config

私が欲しかったのは:

ethernet-dhcp wireless-wpa-config

だから私は試してみます(私の素朴さを許してください):

echo ${(s/*\/)$(ls /etc/network.d/*(.))}

/etc/network.d/ethernet-dhcp /etc/network.d/wireless-wpa-config

これはうまくいかないようです。配列に分割して最後の部分を取得するという賢い方法があるはずですが、私が言うように、私はこれに完全に慣れていません。

どんなアドバイスもありがたく受け取った。

4

4 に答える 4

7

一般的な注意:ファイル名を生成するためにlsを使用する必要はありません。を使用することもできます echo some*glob。しかし、埋め込まれた可能性のある改行文字を保護したい場合でも、それは悪い考えです。以下の最初の例では、埋め込まれた改行を保護するために配列に直接グロブします。2 つ目は、printfを使用して NUL 終了データを生成し、変数を使用せずに同じことを行います。

変数を使用する場合は、簡単に実行できます。

typeset -a entries
entries=(/etc/network.d/*(.)) # generate the list
echo ${entries#/etc/network.d/}  # strip the prefix from each one

変数なしで行うこともできますが、個々のエントリを分離するための余分なものは少し醜いです:

# From the inside, to the outside:
# * glob the entries
#   * NUL terminate them into a single string
# * split at NUL
#   * strip the prefix from each one
echo ${${(0)"$(printf '%s\0' /etc/network.d/*(.))"}#/etc/network.d/}

または、とにかくサブシェルを使用する場合 (つまり、前の例のコマンド置換)、ディレクトリにcdして、グロブ展開の一部にしないようにします (さらに、ディレクトリ名を繰り返す必要はありません)。

echo ${(0)"$(cd /etc/network.d && printf '%s\0' *(.))"}
于 2010-07-05T10:10:05.480 に答える
3

Chris Johnsenの回答は、zshに関する有用な情報でいっぱいですが、この特定のケースで機能するはるかに単純なソリューションについては言及していません。

echo /etc/network.d/*(:t)

これは、t 履歴修飾子glob修飾子として使用しています。

于 2010-07-16T22:00:12.640 に答える
1

ZSHをさらに読んで数日後に問題に戻ってきたあなたの提案に感謝します.私はあなたの利益のために共有したい非常に簡潔な解決策を持っていると思います.

echo ${$(print /etc/network.d/*(.)):t}

于 2010-07-09T13:22:26.847 に答える
0

私はbasename(1)、ディレクトリ コンポーネントを削除するのに慣れています。また、echo /etc/network/*外部lsプログラムを実行せずにファイル リストを取得するために使用できます。(外部プログラムを実行すると、必要以上に完了が遅くなる可能性があります。basename の zsh-builtin は見つかりませんでしたが、それがないという意味ではありません。)

ここに私が役立つことを願っています:

haig% for f in /etc/network/* ; do basename $f ; done
if-down.d
if-post-down.d
if-pre-up.d
if-up.d
interfaces
于 2010-07-05T09:48:26.487 に答える