Toon posts:

Zsh pakt niet de eerste executable in $PATH

Pagina: 1
Acties:
  • 503 views

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mijn vraag
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
$ python3 -m venv .venv
$ . .venv/bin/activate
$ pip install -e .
Obtaining file:///home/iemanddieboosis/raar
Collecting flask (from raar==0.0.0)
  Using cached https://files.pythonhosted.org/packages/7f/e7/08578774ed4536d3242b14dacb4696386634607af824ea997202cd0edb4b/Flask-1.0.2-py2.py3-none-any.whl
Collecting click>=5.1 (from flask->raar==0.0.0)
  Using cached https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl
Collecting Jinja2>=2.10 (from flask->raar==0.0.0)
  Using cached https://files.pythonhosted.org/packages/7f/ff/ae64bacdfc95f27a016a7bed8e8686763ba4d277a78ca76f32659220a731/Jinja2-2.10-py2.py3-none-any.whl
Collecting itsdangerous>=0.24 (from flask->raar==0.0.0)
  Using cached https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl
Collecting Werkzeug>=0.14 (from flask->raar==0.0.0)
  Using cached https://files.pythonhosted.org/packages/20/c4/12e3e56473e52375aa29c4764e70d1b8f3efa6682bef8d0aae04fe335243/Werkzeug-0.14.1-py2.py3-none-any.whl
Collecting MarkupSafe>=0.23 (from Jinja2>=2.10->flask->raar==0.0.0)
  Using cached https://files.pythonhosted.org/packages/e4/c4/adcc2d6f2ac2146cc04e076f14f1006c1de8e1e747fa067668b6573000b8/MarkupSafe-1.1.0-cp37-cp37m-manylinux1_x86_64.whl
Installing collected packages: click, MarkupSafe, Jinja2, itsdangerous, Werkzeug, flask, raar
  Running setup.py develop for raar
Successfully installed Jinja2-2.10 MarkupSafe-1.1.0 Werkzeug-0.14.1 click-7.0 flask-1.0.2 itsdangerous-1.1.0 raar
$ which flask
/home/iemanddieboosis/raar/.venv/bin/flask
$ FLASK_APP=raar flask --version
Flask 1.0.2
Python 3.7.2rc1 (default, Dec 12 2018, 06:25:49) 
[GCC 8.2.0]
$ which flask
/usr/bin/flask
$ /home/iemanddieboosis/raar/.venv/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/iemanddieboosis/.gopath/bin:/home/iemanddieboosis/.config/composer/vendor/bin:/home/iemanddieboosis/.fzf/bin
$ ls -hal /home/iemanddieboosis/raar/.venv/bin
total 44K
drwxr-xr-x 1 iemanddieboosis iemanddieboosis  184 Dec 21 19:35 .
drwxr-xr-x 1 iemanddieboosis iemanddieboosis   66 Dec 21 19:35 ..
-rw-r--r-- 1 iemanddieboosis iemanddieboosis 2.2K Dec 21 19:35 activate
-rw-r--r-- 1 iemanddieboosis iemanddieboosis 1.3K Dec 21 19:35 activate.csh
-rw-r--r-- 1 iemanddieboosis iemanddieboosis 2.4K Dec 21 19:35 activate.fish
-rwxr-xr-x 1 iemanddieboosis iemanddieboosis  256 Dec 21 19:35 easy_install
-rwxr-xr-x 1 iemanddieboosis iemanddieboosis  256 Dec 21 19:35 easy_install-3.7
-rwxr-xr-x 1 iemanddieboosis iemanddieboosis  234 Dec 21 19:35 flask
-rwxr-xr-x 1 iemanddieboosis iemanddieboosis  238 Dec 21 19:35 pip
-rwxr-xr-x 1 iemanddieboosis iemanddieboosis  238 Dec 21 19:35 pip3
-rwxr-xr-x 1 iemanddieboosis iemanddieboosis  238 Dec 21 19:35 pip3.7
lrwxrwxrwx 1 iemanddieboosis iemanddieboosis    7 Dec 21 19:35 python -> python3
lrwxrwxrwx 1 iemanddieboosis iemanddieboosis   16 Dec 21 19:35 python3 -> /usr/bin/python3


Zoals je ziet lijkt Zsh eerst wel de goede Flask uit de venv te pakken, echter pakt die toch de globaal geïnstalleerde Flask wanneer ik hem probeer uit te voeren (wat ik kan bevestigen als ik in mijn app een module probeer te importeren die ik niet globaal geïnstalleerd heb). Dit terwijl als eerste in mijn $PATH de venv staat, en daar ook flask te vinden is als executable. Als ik echter een nieuw tabblad in mijn terminal emulator open en daarin de venv weer activeer, heb ik geen last van dit probleem meer. Waardoor komt dit en hoe los ik dit op?

Relevante software en hardware die ik gebruik
- Debian GNU/Linux Unstable
- Zsh 5.6.2-3

Wat ik al gevonden of geprobeerd heb
Ik heb geprobeerd om in een schone chroot (gemaakt met debootstrap) hetzelfde te doen, maar daar heb ik exact hetzelfde resultaat.

Alle reacties


Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Volgens de man page van which gebruikt which hetzelfde zoekalgoritme als bash.
Volgens de man page van bash wordt PATH afgezocht, maar is er ook een hashtabel, die eerst wordt gebruikt. Door die tabel te manipuleren kun je dus zorgen dan een andere executable wordt gebruikt.
Mogelijk gebruikt zsh ook die hash.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mijzelf schreef op zaterdag 22 december 2018 @ 12:59:
Volgens de man page van which gebruikt which hetzelfde zoekalgoritme als bash.
Volgens de man page van bash wordt PATH afgezocht, maar is er ook een hashtabel, die eerst wordt gebruikt. Door die tabel te manipuleren kun je dus zorgen dan een andere executable wordt gebruikt.
Mogelijk gebruikt zsh ook die hash.
Echter is er in Zsh which ook als shell built-in command, die dus gebruikt wordt. Daarnaast heb ik in Bash dit probleem niet.

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

zsh gebruikt een soort van cache hiervoor, nadat je een programma geinstalleerd hebt in je pad moet je het volgende commando gebruiken om deze opnieuw te bouwen:
rehash

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wolfboy schreef op zondag 23 december 2018 @ 02:15:
zsh gebruikt een soort van cache hiervoor, nadat je een programma geinstalleerd hebt in je pad moet je het volgende commando gebruiken om deze opnieuw te bouwen:
rehash
Na 'rehash' werkt het inderdaad wel, echter is het dan toch raar dat 'which' eerst wel het goede pad zegt, toch?

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Wel apart ja, ik heb eerlijk gezegd geen idee wat er intern gebeurd. Ik gebruik zsh erg veel maar ik ben verre van expert :P

Blog [Stackoverflow] [LinkedIn]


Acties:
  • +1 Henk 'm!

  • sam.vimes
  • Registratie: Januari 2007
  • Laatst online: 08-06 08:44
De shell heeft een interne hashtable zodat een extern commando maar 1 keer via een PATH-search opgezocht hoeft te worden. Als er een nieuw commando wordt geïnstalleerd met dezelfde naam maar dat eerder in het PATH komt, moet de hashtable opnieuw geïnitialiseerd worden met "hash -r" of "rehash". "which" is een extern commando dat geen weet heeft van de interne hashtable van de shell en dat gewoon braaf iedere keer het PATH afloopt.

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 22:30

Hero of Time

Moderator LNX

There is only one Legend

Zo te zien heeft de TS besloten geen gebruik meer te maken van het forum. Dit topic heeft daarom geen zin meer en wordt derhalve gesloten.

[ Voor 3% gewijzigd door Hero of Time op 29-12-2018 22:47 ]

Commandline FTW | Tweakt met mate

Pagina: 1

Dit topic is gesloten.