zsh完了:/ devでブロックデバイスを完了します。

zsh完了:/ devでブロックデバイスを完了します。

/dev私のスクリプトでは、ブロックデバイスを完成させる必要があります。

my_script.sh <TAB>

これにより、リスト内のすべてのディスクが完了して提供されます/dev/(サブディレクトリにはありません)。/devたとえば、

my_script.sh <TAB>
my_script.sh /dev/

my_script.sh /dev/<TAB>
sda sdb sdc mmcblk0p1

my_script.sh /dev/sd
sda sdb sdc 

説明されているとおりに機能するように、完成をどのように変更する必要がありますか?

_arguments -S : \
    '--foo' \
    '--bar' \
    '*:file:_files'

答え1

努力する:

_arguments -S : \
    '--foo' \
    '--bar' \
    '*:block devices:(( /dev/*(-%b:t) ))'

(-%b:t)%bシンボリックリンクの確認後に選択するブロックデバイスを選択するグローバル修飾子であり-、修飾子はそのファイルのすべてのファイルのみを選択:tします。t

_files、を使用できます。特典たとえば、塗り絵から:

_arguments -S : \
    '--foo' \
    '--bar' \
    '*:block devices:_files -W /dev -g "*(-%b)"'

-Wここで_files指定されたオプションを使用してWこれらのファイルを検索しますが、/devその中でより多くのブロックデバイスを見つけるためにサブディレクトリも提供します。

Linuxでは、次のものを使用できます。

    '*:block devices:_files -W /sys/class/block'

または:

    '*:block devices:(( /sys/class/block/*(:t) ))'

これらのブロックデバイスのカーネル名のみを取得します。

答え2

ブロックデバイスのみを探しているので、2つの別々のステップが必要です。

まず、これらの特別な準ファイルのうち、/dev実際にブロックデバイスが何であるかを確認する必要があります。これはを使用して行うことができますstat。このコマンドはUnixでは非常に一般的ですが、何らかの理由でディストリビューションにこのコマンドがない場合apt install coreutils

次のコマンドは、/ devにあるブロックデバイス(800で始まるデバイス)のフルネームで構成される配列を作成します。

blockdevs=($(stat -c "%t %n" /dev/* | grep "^8" | cut -d' ' -f2))

メモ:実際のブロックデバイス以上を探している場合(すべてのファイル名は/devブロックデバイスではありません。通常のファイルやディレクトリに加えて、シンボリックリンクなどのさまざま/dev/ttyなサブタイプなどの「文字特殊ファイル」があります)、上記の配列宣言を編集します。/dev/zero/dev/core


配列がある場合は、配列に格納されている値に基づいて対応する補完を作成できます(引用符は非常に重要です)。

compctl -g "${blockdevs}" my_script.sh

コマンドラインがでmy script.sh始まり、をクリックすると、完成者は/ dev /の開始プレフィックスをTAB自動的に入力します。/dev/' and then display the names of blockdevices found in the top-most level of that directory (i.e.`).

配列値を使用するこのアプローチは、あらゆるタイプのカスタム完成に適用されます。デフォルトでは、最初の単語が一致することを確認しmyscript.sh、2番目の引数で他の入力が検出されない場合は、一致し、(:t)結果で見つかったファイル名(修飾子を含む)のみを表示します。/dev

ターミナルでこの2行のコードを実行するか、両方とも~/.zshrcに追加して完了を維持します。

関連情報