Ohmyzsh: perintah tidak ditemukan setelah memulai zsh di mesin AWS

Dibuat pada 13 Jan 2016  ·  36Komentar  ·  Sumber: ohmyzsh/ohmyzsh

$ zsh
complete:13: command not found: compdef

PEMBARUAN: lihat solusi di https://github.com/robbyrussell/oh-my-zsh/issues/4771#issuecomment -181122099

Komentar yang paling membantu

TL;DR
aws-cli akan diperbarui suatu hari nanti, hingga saat itu:

sudo chmod a-r /etc/profile.d/aws-cli.sh

Semua 36 komentar

Mungkin file compdump yang rusak. Coba lakukan rm ~/*zcompdump* dan mulai ulang zsh.

Saya juga mengalami ini selama beberapa minggu sekarang setelah memutakhirkan oh-my-zsh.

@apjanke Saya menjalankan versi terbaru pada master, saya menghapus semua file compdump, tetapi saya masih melihat complete:13: command not found: compdef

Ini juga bisa menjadi masalah keamanan perusahaan, apakah compaudit mengembalikan sesuatu?

@mcornella compaudit tidak mengembalikan apa pun untuk saya.

Periksa $fpath , mungkin Anda mendefinisikan ulang di suatu tempat di file zshrc Anda, atau mungkin salah secara default di instalasi zsh Anda. Platform mana yang Anda jalankan dan bagaimana zsh diinstal?

Jika itu tidak membantu, berikut adalah beberapa masalah lain yang mungkin membantu Anda berada di jalur yang benar: https://github.com/robbyrussell/oh-my-zsh/issues?q=%22complete+command+not+found +compdef%22+is%3Ditutup

Ini juga mulai muncul untuk saya baru-baru ini, terutama ketika saya mencoba ssh mana saja. compaudit tidak menghasilkan apa-apa, dan menghapus file .zcompdump* tidak akan berpengaruh. Masalah yang dibuka sebelumnya juga tidak menyelesaikan ini untuk saya.

Saya telah menjalankan zsh dan oh-my-zsh dengan sukses di OS X dan CentOS rasa AWS selama beberapa waktu dan menguji semua perubahan terbaru pada dotfiles saya untuk mengesampingkan konfigurasi saya sebagai masalah.

Sehubungan dengan $fpath , saya perhatikan bahwa /scripts/zsh/Completion serta /path/to/oh-my-zsh/completions ada. Saya tidak berpikir ini masalahnya, tetapi tolong perbaiki saya jika saya salah!

Ok saya tidak punya ide lagi, mari kita lihat file zshrc Anda.

Ini zshrc saya.

Saya juga menjalankan centos dan osx rasa aws. Tidak ada masalah di osx, hanya di aws - centos.

$ zsh --version
zsh 5.0.2 (x86_64-redhat-linux-gnu)

$ echo $fpath
/home/ec2-user/.oh-my-zsh/plugins/tmux /home/ec2-user/.oh-my-zsh/plugins/npm /home/ec2-user/.oh-my-zsh/plugins/node /home/ec2-user/.oh-my-zsh/plugins/git /home/ec2-user/.oh-my-zsh/functions /home/ec2-user/.oh-my-zsh/completions /usr/share/zsh/site-functions /usr/share/zsh/5.0.2/functions

Tentu saja! Ini di sini .

Semua yang ada di .zsh-custom hanya mendefinisikan variabel lingkungan khusus dan mengaktifkan plugin zsh-syntax-highlighting. aliases.zsh dan functions.zsh bersumber dari zshrc jika Anda ingin melihatnya juga.

$ zsh --version
zsh 5.0.7 (x86_64-apple-darwin13.4.0)

$ echo $fpath
/scripts/zsh/Completion /Users/dhillard/.zsh-custom/plugins/zsh-syntax-highlighting /Users/dhillard/.oh-my-zsh/plugins/vagrant /Users/dhillard/.oh-my-zsh/plugins/virtualenvwrapper /Users/dhillard/.oh-my-zsh/plugins/supervisor /Users/dhillard/.oh-my-zsh/plugins/rvm /Users/dhillard/.oh-my-zsh/plugins/osx /Users/dhillard/.oh-my-zsh/plugins/python /Users/dhillard/.oh-my-zsh/plugins/pip /Users/dhillard/.oh-my-zsh/plugins/npm /Users/dhillard/.oh-my-zsh/plugins/httpie /Users/dhillard/.oh-my-zsh/plugins/history-substring-search /Users/dhillard/.oh-my-zsh/plugins/history /Users/dhillard/.oh-my-zsh/plugins/git /Users/dhillard/.oh-my-zsh/plugins/docker /Users/dhillard/.oh-my-zsh/plugins/django /Users/dhillard/.oh-my-zsh/plugins/brew /Users/dhillard/.oh-my-zsh/plugins/bower /Users/dhillard/.oh-my-zsh/functions /Users/dhillard/.oh-my-zsh/completions /usr/local/share/zsh/site-functions /usr/share/zsh/site-functions /usr/share/zsh/5.0.8/functions

Fungsi compdef didefinisikan dalam Completion/compinit . Anda seharusnya dapat menemukan file itu dari salah satu direktori $fpath . Coba yang berikut ini:

for d ($fpath); do [[ -f "$d/compinit" ]] && echo $d/compinit; done

dan beri tahu saya jika Anda menemukan sesuatu. Jika tidak, ada beberapa direktori yang hilang di $fpath .

Bagi saya, perintah ini mengembalikan /usr/share/zsh/5.0.8/functions/compinit

@mcornella Ini juga terjadi pada saya di mesin Amazon Linux yang lebih baru. Semua file .zshrc saya tidak berubah. Saya juga memiliki kotak Amazon Linux yang sangat lama di mana saya tidak menerima kesalahan ini. IIRC, saya pertama kali melihat kesalahan sekitar sebulan yang lalu, tetapi saya tidak begitu yakin.

Output saya untuk perintah Anda adalah: /usr/share/zsh/5.0.2/functions/compinit

Juga mengalami masalah ini ...

Saya tidak tahu apa yang sedang terjadi. File zshrc Anda tidak menunjukkan sesuatu yang mencurigakan, jadi saya ingin Anda membuat dump diagnostik dengan menjalankan omz_diagnostic_dump dan memposting file yang dihasilkan sebagai inti pribadi dengan mengikuti petunjuk di https://github.com/ robbyrussell/oh-my-zsh/issues/4771#issuecomment -180574843.

@mcornella ini omz_diagnostic_dump saya

Melihat ke dalamnya...

Tunggu tidak, itu tidak akan membantu saya mendiagnosis ini. Yang saya inginkan sebagai gantinya adalah Anda menjalankan zsh dalam mode debug dan memposting hasilnya sebagai Intisari. Ikuti petunjuk ini dari wiki . Maaf atas kesalahannya! :keringat_senyum:

Berikut ini adalah saya OMZ-debug.log d hapus

Bagian ini ( DIHAPUS ) sepertinya itu masalahnya, atau setidaknya sebagian darinya. Ini dari /etc/profile.d/aws-cli.sh dan /usr/share/zsh/site-functions/aws_zsh_completer.sh , yang terlihat seperti penyelesaian klien AWS kustom untuk zsh dibangun di atas lapisan portabilitas zsh bashcompinit , dan mendefinisikan ulang _bash_complete menggunakan logikanya sendiri. Itu memanggil bashcompinit , tetapi tidak memanggil compinit . Biasanya compinit yang membuat compdef dan fungsi terkait tersedia.

Ini bisa jadi hal-hal klien AWS mengasumsikan bahwa itu akan dipanggil setelah sesuatu yang lain disebut compinit . Saat Anda menjalankan OMZ, biasanya oh-my-zsh.sh yang memanggil compinit . (Dalam kasus Anda yang sedang dilakukan [di sini pada baris 567 dari log itu.) Tetapi karena barang-barang AWS ini bersumber dari /etc/profile.d , itu dijalankan sebelum ~/.zshrc .

Sepertinya hal-hal klien AWS mungkin perlu direvisi jika dijalankan dari /etc/profile.d sebelum file inisialisasi pengguna. Secara khusus, itu (atau sesuatu yang mendahuluinya dalam urutan pemuatan) perlu memanggil compinit . Itu dapat menyebabkan masalah dengan OMZ atau file normal ~/.zshrc yang juga memanggil compinit , karena saya pikir itu mengatur ulang penyelesaian yang ditentukan.

Oh sial! Anda mengalahkan saya untuk itu. Itulah masalahnya. Saya mereproduksi log di bagian akhir untuk referensi di masa mendatang.

Penjelasan:

File aws_zsh_completer.sh adalah bagian dari aws/aws-cli . Lucunya, @blueyed (yang telah memberikan kontribusi signifikan untuk Oh My Zsh, oleh karena itu bagian yang menyenangkan) menyumbangkan komitmen yang membatalkan panggilan ke compinit karena penyelesaiannya terputus: https://github.com/aws/ aws-cli/commit/a2498c41b5bb7bbc189d3251081df1971597a510.

Sekarang, file yang benar-benar menyinggung adalah /etc/profile.d/aws-cli.sh , karena sumber file penyelesaian tanpa menjalankan compinit —atau, setidaknya, sumbernya pada titik waktu di mana compinit seharusnya' sudah dipanggil. /etc/profile.d cukup cepat dalam proses inisialisasi sehingga compinit belum dijalankan. Lihat semua file startup untuk referensi .
Juga, file aws_zsh_completer.sh mengatakan secara eksplisit bahwa file harus bersumber dari file zshrc:

# Typically that would be called somewhere in your .zshrc.

Saya tidak tahu dari paket mana file aws-cli.sh berasal, jadi saya tidak dapat mengirimkan laporan bug; pencarian google cepat hanya mengembalikan bagian file ini dari buku masak Chef , yang benar karena menjalankan compinit sebelumnya, serta posting dalam bahasa Jepang tentang masalah ini yang menyarankan menjalankan compinit dalam ~/.zshenv file untuk memperbaiki masalah ini.

Solusi:

Solusi terakhir tidak akan berfungsi dalam kasus Anda, compinit akan berjalan dua kali dan, sementara Anda tidak akan melihat kesalahan lagi, penyelesaian aws cli tidak akan berfungsi. Anda kemudian dapat mengambil aws_zsh_completer dari dalam file zshrc Anda, tetapi itu adalah alat yang mengerikan yang sangat saya benci .

Saya pikir Anda dapat menonaktifkan pemuatan /etc/profile.d/aws-cli.sh dengan menonaktifkan atribut readable . Inilah bagian relevan dari kode yang memuat file profile.d :

        for i in /etc/profile.d/*.sh; do
        if [ -r "$i" ]; then
            . $i
        fi
        done

Kode [ -r $file ] memeriksa atribut readable dari $file . Jadi dengan chmod a-r /etc/profile.d/aws-cli.sh Anda harus siap .

Item yang dapat ditindaklanjuti:

Untuk semua orang yang memposting di sini dengan masalah ini, Anda harus memastikan bahwa Anda memiliki file /etc/profile.d/aws-cli.sh , atau setidaknya Anda menggunakan aws-cli dalam beberapa cara. Jika yang pertama, Anda sudah dapat menerapkan solusi chmod atas.

Jika bukan itu masalahnya, posting dump diagnostik Anda dan kami akan mencari tahu.


Bagian yang relevan dari log debug . Perhatikan komentar yang mengatakan "_pastikan untuk menjalankan compinit before_" :joy:

+_src_etc_profile_d:11> . /etc/profile.d/aws-cli.sh
if [ -n "$ZSH_VERSION" ]; then
   source /usr/share/zsh/site-functions/aws_zsh_completer.sh
fi
+/etc/profile.d/aws-cli.sh:1> [ -n 5.0.2 ']'
+/etc/profile.d/aws-cli.sh:2> source /usr/share/zsh/site-functions/aws_zsh_completer.sh
# Source this file to activate auto completion for zsh using the bash
# compatibility helper.  Make sure to run `compinit` before, which should be
# given usually.
#
# % source /path/to/zsh_complete.sh
#
# Typically that would be called somewhere in your .zshrc.
#
# Note, the overwrite of _bash_complete() is to export COMP_LINE and COMP_POINT
# That is only required for zsh <= edab1d3dbe61da7efe5f1ac0e40444b2ec9b9570
#
# https://github.com/zsh-users/zsh/commit/edab1d3dbe61da7efe5f1ac0e40444b2ec9b9570
#
# zsh relases prior to that version do not export the required env variables!
#
# It is planned to write a proper zsh auto completion soon. Please talk
# to Frank Becker <[email protected]>.

autoload -Uz bashcompinit
+/usr/share/zsh/site-functions/aws_zsh_completer.sh:19> autoload -Uz bashcompinit
bashcompinit -i
+/usr/share/zsh/site-functions/aws_zsh_completer.sh:20> bashcompinit -i
+bashcompinit:177> unfunction bashcompinit
+bashcompinit:178> autoload -Uz bashcompinit
+bashcompinit:179> return 0

_bash_complete() {
  local ret=1
  local -a suf matches
  local -x COMP_POINT COMP_CWORD
  local -a COMP_WORDS COMPREPLY BASH_VERSINFO
  local -x COMP_LINE="$words"
  local -A savejobstates savejobtexts

  (( COMP_POINT = 1 + ${#${(j. .)words[1,CURRENT]}} + $#QIPREFIX + $#IPREFIX + $#PREFIX ))
  (( COMP_CWORD = CURRENT - 1))
  COMP_WORDS=( $words )
  BASH_VERSINFO=( 2 05b 0 1 release )

  savejobstates=( ${(kv)jobstates} )
  savejobtexts=( ${(kv)jobtexts} )

  [[ ${argv[${argv[(I)nospace]:-0}-1]} = -o ]] && suf=( -S '' )

  matches=( ${(f)"$(compgen $@ -- ${words[CURRENT]})"} )

  if [[ -n $matches ]]; then
    if [[ ${argv[${argv[(I)filenames]:-0}-1]} = -o ]]; then
      compset -P '*/' && matches=( ${matches##*/} )
      compset -S '/*' && matches=( ${matches%%/*} )
      compadd -Q -f "${suf[@]}" -a matches && ret=0
    else
      compadd -Q "${suf[@]}" -a matches && ret=0
    fi
  fi

  if (( ret )); then
    if [[ ${argv[${argv[(I)default]:-0}-1]} = -o ]]; then
      _default "${suf[@]}" && ret=0
    elif [[ ${argv[${argv[(I)dirnames]:-0}-1]} = -o ]]; then
      _directories "${suf[@]}" && ret=0
    fi
  fi

  return ret
}

complete -C aws_completer aws
+/usr/share/zsh/site-functions/aws_zsh_completer.sh:63> complete -C aws_completer aws
+complete:1> emulate -L zsh
+complete:2> local args void cmd print remove
+complete:3> args=( -C aws_completer aws ) 
+complete:4> zparseopts -D -a void o: A: G: W: C: F: P: S: X: a b c d e f g j k u v 'p=print' 'r=remove'
+complete:6> [[ -n '' ]]
+complete:8> [[ -n '' ]]
+complete:13> compdef '_bash_complete -C aws_completer' aws
complete:13: command not found: compdef

Dingin.

Kami (kontributor OMZ) mungkin perlu lebih mewaspadai hal ini. Menurut saya ada lebih banyak distro Linux dan aplikasi klien yang menginstal kustomisasi zsh di tingkat sistem, dan baik mereka maupun OMZ tidak dirancang untuk komposisi. (Tidak ada yang salah dengan itu! Di situlah hal-hal yang dapat dipasang yang berguna untuk semua pengguna harus pergi. Secara default. Dalam sistem yang menghadap pengguna.) IIRC, kami telah melihat ini dengan Ubuntu dan OpenSUSE, dan sampai batas tertentu dengan OS X 10.11.

Tidak ada saling tuding atau menyalahkan; hanya saja, kita seharusnya tidak terlalu berasumsi bahwa OMZ terjadi di atas instalasi stock/vanilla Zsh. (Dan database terminfo, dan seterusnya.) (Juga, mungkin perlu dipertimbangkan bahwa beberapa dari kode ini adalah penyesuaian tingkat pengguna yang diangkat ke tingkat sistem tanpa ditinjau oleh pengguna ahli zsh .)

Saya juga akan melihat apakah saya dapat menambahkan barang profile.d ke omz_diagnostic_dump .

Saya tidak pernah menganggap bahwa pesan kesalahan yang dicetak berasal dari kotak AWS saya daripada dari lokal saya. chmod memasukkan file aws-cli.sh berhasil. Terima kasih untuk penggeledahannya!

:+1: pada trik chmod a-r /etc/profile.d/aws-cli.sh . Setiap kali saya masuk ke kotak AWS saya, saya mendapatkan kesalahan itu dan saya mati sedikit di dalam. Sekarang sudah hilang dan saya ingin memeluk semua orang.

Dari mana /etc/profile.d/aws-cli.sh berasal? ( dpkg -S /etc/profile.d/aws-cli.sh di Debian/Ubuntu)
Saya tidak memilikinya (di Arch Linux).

Saya percaya ini mungkin sudah diinstal sebelumnya di mesin AWS. Tidak tahu harus menghubungi siapa...

Saya menutup masalah ini karena tampaknya diselesaikan untuk semua orang.

Saya percaya ini mungkin sudah diinstal sebelumnya di mesin AWS.

Tergantung pada gambar itu, saya pribadi belum melihatnya.

Meskipun Anda benar, masalah ini tidak benar-benar termasuk di sini, akan tetap baik untuk meneruskannya dengan benar.

Seseorang di utas ini (yang terpengaruh olehnya) harus dapat memberikan informasi ini, bukan?

@blueyed File ini ada di instalasi AWS CentOS saya dan saya tidak _percaya_ bahwa saya meletakkannya di sana. Jika saya melakukannya secara tidak sengaja, kemungkinan itu adalah hasil dari menginstal alat aws-cli.

@daneah inilah yang dikatakan situs web AWS (penekanan milik saya):

AWS CLI sudah diinstal sebelumnya di AMI Amazon Linux . Jalankan sudo yum update setelah terhubung ke instance untuk mendapatkan versi terbaru dari paket yang tersedia melalui yum. Jika Anda memerlukan versi AWS CLI yang lebih baru daripada yang tersedia di repositori pembaruan Amazon, hapus instalan paket (Sudo yum remove aws-cli) lalu instal menggunakan pip.

Mengingat ini adalah mesin CentOS, Anda dapat melakukan yum whatprovides /etc/profile.d/aws-cli.sh untuk memeriksa apakah paket yang dimaksud memang aws-cli , dan jika ya, Anda dapat melakukan yum info aws-cli untuk melihat rincian paket (dan mudah-mudahan email pengelola untuk memberitahukan bug ini).

Beri tahu saya jika ada yang membantu!

@mcornella Benar, maksud saya "ini sepertinya sudah diinstal sebelumnya" :smile: maaf atas kebingungannya.

Tepatnya, itulah yang saya mengerti haha. Kutipan di atas mendukung Anda lebih jauh, jadi intuisi asli Anda benar :wink:

Beri tahu saya jika Anda mendapat kesempatan untuk menguji perintah di atas sehingga kami dapat mengeskalasi bug ini ke siapa pun yang memelihara paket.

Bersulang!

aws-cli secara resmi dikelola oleh AWS sendiri, setahu saya! Menjalankan chmod memang memperbaiki masalah ini untuk saya.

Oke Anda benar. Untungnya seseorang membuka masalah beberapa hari yang lalu dan saya menemukannya sekarang. Masalah yang relevan ada di https://github.com/aws/aws-cli/issues/1819 jika Anda ingin mengikuti diskusi.

Terimakasih semuanya!

Terima kasih @mcornella!

TL;DR
aws-cli akan diperbarui suatu hari nanti, hingga saat itu:

sudo chmod a-r /etc/profile.d/aws-cli.sh

Ini diperbaiki pada aws-cli-1.11.83-1.46, didorong hari ini.

Saya menggunakan solusi chmod dan berhasil, tetapi sekarang saya tidak bisa chsh :

~ ❯❯❯ sudo chsh -s /bin/zsh
Changing shell for root.
chsh: Shell not changed.
Apakah halaman ini membantu?
0 / 5 - 0 peringkat