Giter Club home page Giter Club logo

Comments (34)

guidovansteen avatar guidovansteen commented on August 28, 2024

Thank you for reporting this issue.

Currently fizsh only runs as a login shell if it is explicitly invoked as "fizsh -l" or "fizsh --login". Your ssh session calls fizsh without the l flag. This explains why the new instance of fizsh behaves as a non-login shell. This means that "zprofile" is not sourced. On Arch this means in turn that /etc/profile is not sourced either (see https://wiki.archlinux.org/index.php/zsh). The result on Arch is that no $path is set when fizsh is started, which explains the reported message.

Most other distros do not have this problem, because their zsh does not depend on $path being set in /etc/profile.

The issue can indeed be circumvented by manually sourcing zprofile before $(type fizsh) is evaluated.

from fizsh.

dbeecham avatar dbeecham commented on August 28, 2024

All right, I have tried around with --login, but I cannot seem to quite figure it out.

Firstly, I cannot set /usr/local/bin/fizsh --login as shell in /etc/passwd; doing to gives me an error shell /path/fizsh --login does not exist. Not sure if I should add this to /etc/shells, of if I need to escape spaces in passwd, or if this just does not work. So, I created a script:

$ cat /usr/local/bin/fizsh-local
#!/usr/bin/env zsh

echo $PATH

/usr/local/bin/fizsh --login

I also added a echo $PATH at the top in fizsh.

/usr/bin:/bin:/usr/sbin:/sbin

Is the PATH echoed. So $PATH is not empty. But /usr/local/bin isn't added before /etc/profile is sourced. Also, --login in /usr/local/bin/fizsh-local did not work.

from fizsh.

dbeecham avatar dbeecham commented on August 28, 2024

I am reading though the source code, trying to understand how to solve the problem. type fizsh is called on line 58. The only reference to --login is on line 148, but it falls into the same condition as no arguments. Am I missing something?

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

Around line 170 you will find:

if [[ ( $@ == "" ) ]]; then zsh else zsh -l fi

So, if fizsh is invoked with a command-line argument (which in this case must be -l or --login) then it is started as "zsh -l" (after setting $ZDOTDIR and some other things).

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

At this moment I do not have an arch machine to test things. I have one at home. I will look into it later.

from fizsh.

dbeecham avatar dbeecham commented on August 28, 2024

Ah, I see. The shell is exiting at line 59 though. Should some code be moved around?

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

But /usr/local/bin isn't added before /etc/profile is sourced.

So /usr/bin is in your path. In that case you could install fizsh as /usr/bin/fizsh. Try something like:

user@localmachine$ ./configure --bindir=/usr/bin

See https://github.com/zsh-users/fizsh#install

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

Some further thought:

The script /usr/bin/fizsh (in your case /usr/local/bin/fizsh) is initially invoked as a non-login shell. This makes difficult to determine whether the eventual fizsh shell should be run as a login-shell or not. Because of this fizsh requires the "-l" or "--login" option in order to be started as a login shell.

Yet, after using "ssh -l user@...", "sudo -iu user" or "su -i user", you should get a login shell as well. As you already noted, the problem is that in this case the system logs you in through the /etc/password file, which makes it difficult to provide the -i flag.

If we don't find a proper solution, I will add a note about this in the manpage in the "BUGS" section.

from fizsh.

dbeecham avatar dbeecham commented on August 28, 2024

Even if fizsh is started with the --login argument, the shell will still fail, though? The flag is not used until the call to zsh, $(type fizsh) will be empty anyway.

I can see the issue, though. zsh should be doing the sourcing, but it can't do it before fizsh has set up all it needs to, but it can't set it up before zsh has done the sourcing. It's a catch 22.

I also just realized my line numbers are different from yours since I edited the file.

from fizsh.

dbeecham avatar dbeecham commented on August 28, 2024

A thought; is it possible to use $0?

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

Even if fizsh is started with the --login argument, the shell will still fail, though?
The flag is not used until the call to zsh, $(type fizsh) will be empty anyway.

If fizsh is installed as /usr/bin/fizsh and if /usr/bin is part of your path $(type fizsh) will yield /usr/bin/fizsh. This is how fizsh works by default on Debian.

If /usr/local/bin is added to the path at the same time as /usr/bin things will work as well.

Wouldn't you encounter similar problems if zsh is only installed in /usr/local/bin and /usr/local/bin is not part of the path? Or what if zsh is only installed in /usr/bin (as is the case on e.g. Debian) and /usr/bin is not part of the path?

$ zsh -fd
% echo $path
/usr/local/bin /usr/bin /bin /usr/bin/X11 /usr/games
% path="/usr/local/bin /bin /usr/bin/X11 /usr/games"
% zsh
zsh: command not found: zsh

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

Merged with the above comment

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

Removed... Have to look at $0 once more.

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

zsh actually distinguishes two types of login shells: (1) shells started by login and (2) shells started with the -l or --login option.

Type 1 login shells can be detected using the environment variable $SHLVL. For zsh type 1 login shells $SHLVL is always equal to 1. This implies that for fizsh type 1 login shells $SHLVL is always equal to 2. The reason for this is that /usr/bin/fizsh is a zsh script, in which $SHLVL is 1. /usr/bin/fizsh makes sure fizsh can be started with another call to zsh. This additional call to zsh increases $SHLVL to 2.

Type 2 login shells can be detected by exporting an additional environment variable, e.g. $_fizsh_F_LOGIN_OPTION_SET before fizsh is started in /usr/bin/fizsh. After fizsh has started this exported variable could copied to a local (i.e. unexported) version of the environment variable, e.g. $_fizsh_F_LOCAL_LOGIN_OPTION_SET. The original exported variable could subsequently be unset, so that it does not exist, when one more subshell is started.

Depending on the values of the environment variables $SHLVL, $_fizsh_F_LOGIN_OPTION_SET, zsh could be called with or without the -l flag in the script /usr/bin/fiszh.

Depending on the values of the environment variables $SHLVL, $_fizsh_F_LOCAL_LOGIN_OPTION_SET, $0 could be set to -fizsh or fizsh by /etc/fizsh/fizshrc.

In the next version of fizsh I intend to implement the treatment of loginshells as outlined above.

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

http://www.zsh.org/mla/workers/2007/msg00270.html and subsequent reactions provide interesting information as well.

fizsh's man page should probably mention that things like ssh -t someserver "cd $(pwd) && ARGV0=-\$0 exec \$0" do not work as described there.

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

Closing this issue (see the above commits).

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

PS: The original issue of fizsh not being able to find its path, is IMO misconfiguration problem not specifically related to fizsh.

If Pacman had done the installation, the fizsh script should have been installed in /usr/bin. This would have prevented the problem. /usr/local/bin is the responsability of the local administrator. If he decides to install fizsh there, he should make sure that /usr/local/bin is available when fizsh is started as a login shell. This may for example be achieved by having zprofile or zlogin add /usr/local/bin to the $path variable.

from fizsh.

 avatar commented on August 28, 2024

On OSX the issue still persists. Due to security reasons, on OSX 10.11 /usr/bin is protected by SIP (Security Integrity Protection) http://arstechnica.com/apple/2015/09/os-x-10-11-el-capitan-the-ars-technica-review/8/

Installing 1.0.8 can be done by brew install fizsh and will place bin aliases into /usr/local

fibrics-Mac-Pro% fizsh
welcome to fizsh, the friendly interactive zshell
type man fizsh for instructions on how to use fizsh
fibric@fibrics-Mac-Pro ~>

But when changing my default shell from zsh to fizsh then I see this:

Last login: Sat Oct  3 08:32:55 on ttys001
_fizsh: Make sure that fizsh is installed correctly and that your path is set accordingly

[Process completed]

At the point of [Process completed] the terminal window is dead.

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

Strange... This error message occurs when the command type fizsh cannot find the fizsh binary. Not finding the fizsh binary causes your seemingly dead terminal window. Usually this happens when the directory of the fizsh binary is not part of $path. Therefore, after you arrive at the seemingly dead terminal window, can you report the output of type fizsh and echo $path?

I do not have OS X and brew here. So I cannot test the issue myself.

You might want to check if the problem is related to brew install. To find out, just install fizsh manually:

mkdir ./fizsh_sources
cd ./fizsh_sources
git clone https://github.com/zsh-users/fizsh.git
cd fizsh
./configure \
--prefix=/usr/local \
--includedir=/usr/local/include \
--datadir=/usr/local/share \
--bindir=/usr/local/bin \
--libexecdir=/usr/local/lib/fizsh \
--localstatedir=/var/local \
--sysconfdir=/etc/local
make
sudo make install
chsh -s /usr/local/bin/fizsh
su $USER

If this does work, I would expect the problem to be caused by brew install.

Best wishes,

Guido

from fizsh.

gerstorfer avatar gerstorfer commented on August 28, 2024

Manual installation makes no difference.

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

Could you report the output of type fizsh and echo $path?

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

And could you report the ouput of the manal installation process as well?

from fizsh.

gerstorfer avatar gerstorfer commented on August 28, 2024

It appears, that the path ist set only to /usr/bin and /bin and type fizsh says fizsh not found. Also fizsh sources none of the following: /etc/zprofile, /etc/zshrc, ~/.zlogin, ~/.zprofileBut /etc/zshenv is sourced, so the path can be set there and it works, without messing with /usr/local/bin/fizsh. But maybe there is still a better solution...

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

Thank you for reporting this.

I have read some posts on the OSX-specific way of setting the system-wide path (e.g. https://serverfault.com/questions/16355/how-to-set-global-path-on-os-x). Directories to be included in it should be listed in the file /etc/paths.

So, local administrators who allow executables in /usr/local/bin/ should add the entry /usr/local/bin/ to the file /etc/paths. This should be done BEFORE any executable in /usr/local/bin/ is executed.

Changing PATH in /etc/zshenv may technically work as well. The same may apply to changing PATH in /etc/launchd.conf. However, if I were on OSX I would rather create the system-wide path correctly using /etc/paths.

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

It would not hurt to add an extra configuration file called ~/.fprofile or ~/.zshenv. This file would be sourced immediately after fizsh is started. I might add such a file in the next fizsh release.

ADDED LATER:
On second thought: it would hurt. Fizsh is meant to be a friendly shell, and additional configuration files would make fizsh less friendly.

from fizsh.

gerstorfer avatar gerstorfer commented on August 28, 2024

I would like to note, that I added /usr/local/bin to /etc/paths (and /etc/launchd.conf and /etc/paths.d/) without success. I tried a lot of other stuff too. In the end, using /etc/zshenv was the only feasible workaround.

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

I have access to an OSX machine (10.8.5). On this machine there is a file called /etc/zshenv. It contains:

$ cat /etc/zshenv
...
if [ -x /usr/libexec/path_helper ]; then
eval /usr/libexec/path_helper -s
fi

This path_helper program sets the path using the contents of /etc/paths. In my case this seems to work properly.

from fizsh.

gerstorfer avatar gerstorfer commented on August 28, 2024

On OSX 10.11 /etc/zshenv does not exist anymore and has to be created with this content.

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

OK, now I understand.

Can you set the path in ~/.zshenv? Or is that not working either?
Does the path_helper binary still exist in OSX 10.11?

from fizsh.

gerstorfer avatar gerstorfer commented on August 28, 2024

Yes! I can set the path in ~/.zshenv and path_helper still exists and works as advertised.

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

Thank you, it is good to know this!

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

The code commited to prevent this issue is 9a128f3.

from fizsh.

guidovansteen avatar guidovansteen commented on August 28, 2024

On second thought: Since this issue has now been solved in a relatively simple way, I will refrain from adding extra configuration files like /etc/fizsh/fizshenv and ~/.fizsh/.fizshenv. Fizsh is meant to be a friendly shell. Therefore, I will keep the number of configuration files as small as possible.

from fizsh.

djbclark avatar djbclark commented on August 28, 2024

I can report this does work on 10.11. Only comment is that it would be nice to have fizsh tell the user in the error message to try putting PATH in .zshenv rather than making thr user find this thread :-) (BTW great work in general, Iam really enjoying it.) Oh and also --login seems to no longer be required; or at least seems to be working fine without it via iterm and ssh.

from fizsh.

Related Issues (18)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.