Apa yang dilakukan _pembang?

12

Saya bekerja dengan shell, dan secara tidak sengaja saya melengkapi dengan tabsetelah menulis _e, yang menghasilkan _expand.

Apa yang dilakukan perintah ini? Saya tidak dapat menemukan penjelasan online, satu-satunya referensi yang dapat saya temukan di sini di Tanya Ubuntu adalah:

Tetapi mereka tidak menjawab pertanyaan saya. Sebaliknya, mereka membuka lebih banyak pertanyaan dari jenis yang sama tentang perintah seperti _complete, _complete_as_root, dll

scristalli
sumber

Jawaban:

14

Anda dapat mengetahui apa yang _expanddilakukan, saat mengetik

$ type _expand
_expand is a function
_expand ()
{
    if [[ "$cur" == \~*/* ]]; then
        eval cur=$cur;
    else
        if [[ "$cur" == \~* ]]; then
            cur=${cur#\~};
            COMPREPLY=($( compgen -P '~' -u "$cur" ));
            [ ${#COMPREPLY[@]} -eq 1 ] && eval COMPREPLY[0]=${COMPREPLY[0]};
            return ${#COMPREPLY[@]};
        fi;
    fi
}

Ini adalah fungsi dalam mekanisme penyelesaian bash. Itu memperluas tildes ( ~) di nama path. Di /etc/bash_completionadalah komentar tentang fungsi:

# Expand ~username type directory specifications.  We want to expand
# ~foo/... to /home/foo/... to avoid problems when $cur starting with
# a tilde is fed to commands and ending up quoted instead of expanded.

Cobalah di terminal, ketik:

~<tab><tab>

Ini akan diperluas ke nama pengguna, misalnya

~usera     ~userb     ~userc
kekacauan
sumber
1
Terima kasih, saya tidak tahu perintahnya type. Tidak jelas bagi saya mengapa saya tidak dapat memanggil fungsi-fungsi ini sebagai _function_name [argument], tetapi sekarang saya mengerti bahwa mereka melayani tujuan mereka sebagai ekstensi autocomplete, dan fakta bahwa mereka muncul di autocomplete saya hanya karena mereka dideklarasikan (tetapi mereka tidak dimaksudkan untuk dipanggil langsung).
scristalli
3
Tepatnya _expandfungsi, karena semua fungsi lengkap lainnya, hanya memanipulasi COMPREPLYarray, berdasarkan nilai-nilai $curyang mengandung pola penyelesaian.
kekacauan