Nixpkgs: Bash4 or Fish shell

Created on 13 Oct 2016  路  3Comments  路  Source: NixOS/nixpkgs

Issue

fish - don't know how to set path; also was told to load profile stuff one by one, not by PATH

bash4 returns this;

# System-wide .bashrc file for interactive bash(1) shells.
if [ -z "$PS1" ]; then
   return
fi

PS1='\h:\W \u\$ '
# Make bash check its window size after a process completes
shopt -s checkwinsize

[ -r "/etc/bashrc_$TERM_PROGRAM" ] && . "/etc/bashrc_$TERM_PROGRAM"
# bash support for Terminal.


# Working Directory
#
# Tell the terminal about the current working directory at each prompt.

if [ -z "$INSIDE_EMACS" ]; then
    update_terminal_cwd() {
    # Identify the directory using a "file:" scheme URL, including
    # the host name to disambiguate local vs. remote paths.

    # Percent-encode the pathname.
    local url_path=''
    {
        # Use LC_CTYPE=C to process text byte-by-byte. Ensure that
        # LC_ALL isn't set, so it doesn't interfere.
        local i ch hexch LC_CTYPE=C LC_ALL=
        for ((i = 0; i < ${#PWD}; ++i)); do
        ch="${PWD:i:1}"
        if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then
            url_path+="$ch"
        else
            printf -v hexch "%02X" "'$ch"
            # printf treats values greater than 127 as
            # negative and pads with "FF", so truncate.
            url_path+="%${hexch: -2:2}"
        fi
        done
    }

    printf '\e]7;%s\a' "file://$HOSTNAME$url_path"
    }
    PROMPT_COMMAND="update_terminal_cwd${PROMPT_COMMAND:+; $PROMPT_COMMAND}"
fi


# Resume Support: Save/Restore Shell State
#
# Terminal assigns each terminal session a unique identifier and
# communicates it via the TERM_SESSION_ID environment variable so that
# programs running in a terminal can save/restore application-specific
# state when quitting and restarting Terminal with Resume enabled.
#
# The following code defines a shell save/restore mechanism. Users can
# add custom state by defining a shell_session_save_user_state function
# that writes restoration commands to the session file at exit. e.g.,
# to save a variable:
#
#   shell_session_save_user_state() { echo MY_VAR="'$MY_VAR'" >> "$SHELL_SESSION_FILE"; }
#
# During shell startup the session file is executed. Old files are
# periodically deleted.
#
# The default behavior arranges to save and restore the bash command
# history independently for each restored terminal session. It also
# merges commands into the global history for new sessions. Because
# of this it is recommended that you set HISTSIZE and HISTFILESIZE to
# larger values.
#
# You may disable this behavior and share a single history by setting
# SHELL_SESSION_HISTORY to 0. There are some common user customizations
# that arrange to share new commands among running shells by
# manipulating the history at each prompt, and they typically include
# 'shopt -s histappend'; therefore, if the histappend shell option is
# enabled, per-session history is disabled by default. You may
# explicitly enable it by setting SHELL_SESSION_HISTORY to 1.
#
# The implementation of per-session command histories in combination
# with a shared global command history is incompatible with the
# HISTTIMEFORMAT variable--the timestamps are applied inconsistently
# to different parts of the history; therefore, if HISTTIMEFORMAT is
# defined, per-session history is disabled by default.
#
# Note that this uses PROMPT_COMMAND to enable per-session history
# the first time for each new session. If you customize PROMPT_COMMAND
# be sure to include the previous value. e.g.,
#
#   PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND; }your_code_here"
#
# Otherwise, the per-session history won't take effect until the first
# restore.
#
# The save/restore mechanism is disabled if the following file exists:
#
#   ~/.bash_sessions_disable

if [ ${SHELL_SESSION_DID_INIT:-0} -eq 0 ] && [ -n "$TERM_SESSION_ID" ] && [ ! -e "$HOME/.bash_sessions_disable" ]; then

    # Do not perform this setup more than once (which shouldn't occur
    # unless the user's ~/.bash_profile executes /etc/profile, which
    # is normally redundant).
    SHELL_SESSION_DID_INIT=1

    # Set up the session directory/file.
    SHELL_SESSION_DIR="$HOME/.bash_sessions"
    SHELL_SESSION_FILE="$SHELL_SESSION_DIR/$TERM_SESSION_ID.session"
    mkdir -p "$SHELL_SESSION_DIR"

    #
    # Restore previous session state.
    #

    if [ -r "$SHELL_SESSION_FILE" ]; then
    . "$SHELL_SESSION_FILE"
    rm "$SHELL_SESSION_FILE"
    fi

    #
    # Arrange for per-session shell command history.
    #

    shell_session_history_allowed() {
    # Return whether per-session history should be enabled.
    if [ -n "$HISTFILE" ]; then
        # If this defaults to off, leave it unset so that we can
        # check again later. If it defaults to on, make it stick.
        local allowed=0
        if shopt -q histappend || [ -n "$HISTTIMEFORMAT" ]; then
        allowed=${SHELL_SESSION_HISTORY:-0}
        else
        allowed=${SHELL_SESSION_HISTORY:=1}
        fi
        if [ $allowed -eq 1 ]; then
        return 0
        fi
    fi
    return 1
    }

    if [ ${SHELL_SESSION_HISTORY:-1} -eq 1 ]; then
    SHELL_SESSION_HISTFILE="$SHELL_SESSION_DIR/$TERM_SESSION_ID.history"
    SHELL_SESSION_HISTFILE_NEW="$SHELL_SESSION_DIR/$TERM_SESSION_ID.historynew"
    SHELL_SESSION_HISTFILE_SHARED="$HISTFILE"

    shell_session_history_enable() {
        touch "$SHELL_SESSION_HISTFILE_NEW"
        HISTFILE="$SHELL_SESSION_HISTFILE_NEW"
        SHELL_SESSION_HISTORY=1
    }

    # If the session history already exists and isn't empty, start
    # using it now; otherwise, we'll use the shared history until
    # we've determined whether users have enabled/disabled this.
    if [ -s "$SHELL_SESSION_HISTFILE" ]; then
        history -r "$SHELL_SESSION_HISTFILE"
        shell_session_history_enable
    else
        # At the first prompt, check whether per-session history should
        # be enabled. Delaying until after user scripts have run allows
        # users to opt in or out. If this doesn't get executed (because
        # the user has replaced PROMPT_COMMAND instead of concatenating
        # it), we'll check at shell exit; that works, but doesn't start
        # the per-session history until the first restore.

        shell_session_history_check() {
        if [ ${SHELL_SESSION_DID_HISTORY_CHECK:-0} -eq 0 ]; then
            SHELL_SESSION_DID_HISTORY_CHECK=1
            if shell_session_history_allowed; then
            shell_session_history_enable
            fi
            # Remove this check if we can; otherwise, we rely on the
            # variable above to prevent checking more than once.
            if [ "$PROMPT_COMMAND" = "shell_session_history_check" ]; then
            unset PROMPT_COMMAND
            elif [[ $PROMPT_COMMAND =~ (.*)(; *shell_session_history_check *| *shell_session_history_check *; *)(.*) ]]; then
            PROMPT_COMMAND="${BASH_REMATCH[1]}${BASH_REMATCH[3]}"
            fi
        fi
        }
        PROMPT_COMMAND="shell_session_history_check${PROMPT_COMMAND:+; $PROMPT_COMMAND}"
    fi

    shell_session_save_history() {
        # Save new history to an intermediate file so we can copy it.
        shell_session_history_enable
        history -a
        # If the session history doesn't exist yet, copy the shared history.
        if [ -f "$SHELL_SESSION_HISTFILE_SHARED" ] && [ ! -s "$SHELL_SESSION_HISTFILE" ]; then
        echo -ne '\n...copying shared history...'
        cp "$SHELL_SESSION_HISTFILE_SHARED" "$SHELL_SESSION_HISTFILE"
        fi
        # Save new history to the per-session and shared files.
        echo -ne '\n...saving history...'
        cat "$SHELL_SESSION_HISTFILE_NEW" >> "$SHELL_SESSION_HISTFILE_SHARED"
        cat "$SHELL_SESSION_HISTFILE_NEW" >> "$SHELL_SESSION_HISTFILE"
        : >| "$SHELL_SESSION_HISTFILE_NEW"
        # If there is a history file size limit, apply it to the files.
        if [ -n "$HISTFILESIZE" ]; then
        echo -n 'truncating history files...'
        HISTFILE="$SHELL_SESSION_HISTFILE_SHARED"
        HISTFILESIZE="$HISTFILESIZE"
        HISTFILE="$SHELL_SESSION_HISTFILE"
        HISTFILESIZE="$size"
        HISTFILE="$SHELL_SESSION_HISTFILE_NEW"
        fi
        echo -ne '\n...'
    }
    fi

    #
    # Arrange to save session state when exiting the shell.
    #

    shell_session_save() {
    # Save the current state.
    if [ -n "$SHELL_SESSION_FILE" ]; then
        echo -n 'Saving session...'
        echo echo Restored session: $(date) >| "$SHELL_SESSION_FILE"
        declare -F shell_session_save_user_state >/dev/null && shell_session_save_user_state
        shell_session_history_allowed && shell_session_save_history
        echo 'completed.'
    fi
    }

    # Delete old session files. (Not more than once a day.)
    SHELL_SESSION_TIMESTAMP_FILE="$SHELL_SESSION_DIR/_expiration_check_timestamp"
    shell_session_delete_expired() {
    if ([ ! -e "$SHELL_SESSION_TIMESTAMP_FILE" ] || [ -z $(find "$SHELL_SESSION_TIMESTAMP_FILE" -mtime -1d) ]); then
        local expiration_lock_file="$SHELL_SESSION_DIR/_expiration_lockfile"
        if shlock -f "$expiration_lock_file" -p $$; then
        echo -n 'Deleting expired sessions...'
        local delete_count=$(find "$SHELL_SESSION_DIR" -type f -mtime +2w -print -delete | wc -l)
        [ "$delete_count" -gt 0 ] && echo $delete_count' completed.' || echo 'none found.'
        touch "$SHELL_SESSION_TIMESTAMP_FILE"
        rm "$expiration_lock_file"
        fi
    fi
    }

    # Update saved session state when exiting.
    shell_session_update() {
    shell_session_save && shell_session_delete_expired
    }
    trap shell_session_update EXIT
fi
update_terminal_cwd
MacBook-Air-Maciej:client maciejciniewski$ ^C
update_terminal_cwd
MacBook-Air-Maciej:client maciejciniewski$ exit
shell_session_update
Saving session...date

...saving history...truncating history files...
...completed.
find "$SHELL_SESSION_TIMESTAMP_FILE" -mtime -1d

and then every typed thing returns ugly unicode

Steps to reproduce

bash:
nix-env -i bash4

Technical details

  • System: OSX El Capitan
  • Nix version: 1.11.4
  • Nixpkgs version: "17.03pre93141.e3deccc"
question darwin reporter feedback

Most helpful comment

Sorry, this issue is impossible to parse as is. Please clarify.

All 3 comments

@Pszek I'm having a hard time understanding what's going on. Are you just confused about setting your PATH on the Fish shell?

Sorry, this issue is impossible to parse as is. Please clarify.

No response, closing this for now.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

ayyess picture ayyess  路  3Comments

ob7 picture ob7  路  3Comments

spacekitteh picture spacekitteh  路  3Comments

matthiasbeyer picture matthiasbeyer  路  3Comments

copumpkin picture copumpkin  路  3Comments