zsh:找不到命令(对于 $EDITOR)

发布于 2024-12-18 07:59:33 字数 7337 浏览 3 评论 0原文

无论出于何种原因,zsh 不喜欢我为 $EDITOR 变量设置命令行参数,但据我所知,它不应该是这样的。我见过人们

export EDITOR='open -Wn'

在他们的 ~/.zshrc 文件中使用,但是当我尝试这样做时,我只是收到了抱怨。

zsh: command not found: open -Wn

有什么原因可能会发生这种情况吗?将 $EDITOR 设置为 'mate''vim''open' 似乎工作得很好,但 'mate -w''open -Wn' 不起作用。

我在 Mac OS X 上的屏幕内运行 zsh,我的 ~/.zshrc 如下:

# -----------------------------------------------
# Screen Settings
# -----------------------------------------------

# If screen isn't already running, turn it on.
if [[ $STY == '' ]]; then
    # Execute screen.
    exec screen -aADRU
fi

# -----------------------------------------------
# Startup Scripts
# -----------------------------------------------

cd ~/Desktop
[[ -s "~/.rvm/scripts/rvm" ]] && source "~/.rvm/scripts/rvm"

# -----------------------------------------------
# Environment Variables
# -----------------------------------------------

export HISTFILE=~/.zsh_history
export HISTSIZE=10000
export HISTCONTROL=ignoredups
export SAVEHIST=10000

export PATH=.:/usr/local/bin:/usr/local/sbin:/usr/local/narwhal/bin:/bin:/sbin:/usr/bin:/usr/local/share:/usr/sbin:/usr/local/texlive/2011/bin/universal-darwin
export EDITOR='open -Wn'
export LC_TYPE=en_US.UTF-8
export LSCOLORS=exFxcxdxAxexbxHxGxcxBx

# -----------------------------------------------
# Prompt
# -----------------------------------------------

## Root Prompt
[ $UID = 0 ] && export PROMPT="%~ +=> " && export RPROMPT="%*"

## General Prompt
[ $UID != 0 ] && export PROMPT="%~ => " && export RPROMPT="%*"

# -----------------------------------------------
# Aliases
# -----------------------------------------------

## Command Aliases
alias ..='cd ..'
alias ...='cd ../..'
alias internet='lsof -P -i -n | cut -f 1 -d " " | uniq'
alias restart='sudo shutdown -r NOW'
alias ls='ls -@1AFGph'
alias tree='tree -alCF --charset=UTF-8 --du --si'
alias mate='mate -w'
alias zshrc='$EDITOR ~/.zshrc && source ~/.zshrc'
alias vimrc='$EDITOR ~/.vimrc.local'
alias gvimrc='$EDITOR ~/.gvimrc.local'

## Root Aliases
[ $UID = 0 ] && \
    alias rm='rm -i' && \
    alias mv='mv -i' && \
    alias cp='cp -i'

# -----------------------------------------------
# User-defined Functions
# -----------------------------------------------

# Usage: extract <file>
# Description: extracts archived files / mounts disk images.
# Note: .dmg/hdiutil is Mac OS X-specific.
extract () {
    if [ -f $1 ]; then
        case $1 in
            *.tar.bz2)  tar -jxvf $1        ;;
            *.tar.gz)   tar -zxvf $1        ;;
            *.bz2)      bunzip2 $1          ;;
            *.dmg)      hdiutul mount $1    ;;
            *.gz)       gunzip $1           ;;
            *.tar)      tar -xvf $1         ;;
            *.tbz2)     tar -jxvf $1        ;;
            *.tgz)      tar -zxvf $1        ;;
            *.zip)      unzip $1            ;;
            *.Z)        uncompress $1       ;;
            *)          echo "'$1' cannot be extracted/mounted via extract()." ;;
        esac
    else
        echo "'$1' is not a valid file."
    fi
}


# Usage: pman <manpage>
# Description: opens up the selected man page in Preview.
pman () {
    man -t $@ | open -f -a /Applications/Preview.app
}

# Usage: fp <name>
# Description: find and list processes matching a case-insensitive partial-match string.
fp () {
    ps Ao pid,comm|awk '{match($0,/[^\/]+$/); print substr($0,RSTART,RLENGTH)": "$1}'|grep -i $1|grep -v grep
}

# Usage: fk <name>
# Description: find and kill a process matching a case-insensitive partial-match string.
fk () {
    IFS=$'\n'
    PS3='Kill which process? (1 to cancel): '
    select OPT in "Cancel" $(fp $1); do
        if [ $OPT != "Cancel" ]; then
            kill $(echo $OPT|awk '{print $NF}')
        fi
        break
    done
    unset IFS
}

# Usage: create <file>
# Description: creates and opens a file for editing.
create () {
    touch $1 && open $1
}

# Usage: reset
# Description: 'resets' the terminal by changing the current working directory
# to the desktop and clearing the screen.
reset () {
    cd ~/Desktop; clear
}

# Usage: quit
# Description: exits the terminal.
quit () {
    killall Terminal
}

# -----------------------------------------------
# zsh Options
# -----------------------------------------------

# Directories
setopt                  \
    AUTO_CD             \
    AUTO_PUSHD          \
    CD_ABLE_VARS        \
    CHASE_DOTS          \
    CHASE_LINKS         \

# Completion
setopt                  \
    AUTO_LIST           \
    AUTO_MENU           \
    AUTO_PARAM_SLASH    \
    COMPLETE_IN_WORD    \
    LIST_TYPES          \
    MENU_COMPLETE       \
    REC_EXACT           \

# History
setopt                  \
    APPEND_HISTORY      \
    EXTENDED_HISTORY    \

# Input/Output
setopt                  \
    CORRECT             \

# Scripts and Functions
setopt                  \
    MULTIOS             \

# Other
setopt                  \
    NO_BEEP             \
    ZLE

# Key Bindings
bindkey "^[[3~" delete-char

# -----------------------------------------------
# zsh Autocompletion
# -----------------------------------------------

# Turn on auto-completion.
autoload -U compinit && compinit -C && autoload -U zstyle+

# Attempt to complete as much as possible.
zstyle ':completion:*' completer _complete _list _oldlist _expand _ignored _match _correct
zstyle ':completion:*::::' completer _expand _complete _ignored _approximate

# Sort files by name.
zstyle ':completion:*' file-sort name

# Allow for case-insensitive completion.
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'

# Color completions.
zstyle ':completion:*' list-colors ${LSCOLORS}
zstyle ':completion:*:*:kill:*:processes' command 'ps -axco pid,user,command'
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31'

# Set the amount of completions that triggers the menu.
zstyle ':completion:*' menu select=long

# Ignore certain patterns.
zstyle ':completion:*:functions' ignored-patterns '_*'
zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~'
zstyle ':completion:*:*:(^rm):*:*files' ignored-patterns '*?.(o|c~|old|pro|zwc)'

# Cache completions.
zstyle ':completion::complete:*' use-cache 1
zstyle ':completion::complete:*' cache-path ~/.zcompcache/$HOST

# Allow errors.
zstyle -e ':completion:*:approximate:*' max-errors 'reply=( $(( ($#PREFIX+$#SUFFIX)/2 )) numeric )'

# Insert all expansions for expand completer (eh, don't know what this does).
zstyle ':completion:*:expand:*' tag-order all-expansions

# Formatting and messages.
zstyle ':completion:*' list-prompt '%SAt %p: Hit TAB for more, or the character to insert%s'
zstyle ':completion:*' verbose yes
zstyle ':completion:*:descriptions' format '%B%d%b'
zstyle ':completion:*:messages' format '%d'
zstyle ':completion:*:warnings' format 'No matches for: %d'
zstyle ':completion:*:corrections' format '%B%d (errors: %e)%b'
zstyle ':completion:*' group-name ''

# Offer indexes before parameters in subscripts.
zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters

For whatever reason, zsh doesn't like me setting command-line arguments for my $EDITOR variable, but from what I can tell, it's not supposed to be this way. I've seen people use

export EDITOR='open -Wn'

in their ~/.zshrc file, but when I try to do that, I just get a complaint.

zsh: command not found: open -Wn

Any reason why this might be happening? Setting the $EDITOR to 'mate', 'vim' or 'open' seems to work just fine, but 'mate -w' and 'open -Wn' don't work.

I'm running zsh inside screen on Mac OS X, and my ~/.zshrc is as follows:

# -----------------------------------------------
# Screen Settings
# -----------------------------------------------

# If screen isn't already running, turn it on.
if [[ $STY == '' ]]; then
    # Execute screen.
    exec screen -aADRU
fi

# -----------------------------------------------
# Startup Scripts
# -----------------------------------------------

cd ~/Desktop
[[ -s "~/.rvm/scripts/rvm" ]] && source "~/.rvm/scripts/rvm"

# -----------------------------------------------
# Environment Variables
# -----------------------------------------------

export HISTFILE=~/.zsh_history
export HISTSIZE=10000
export HISTCONTROL=ignoredups
export SAVEHIST=10000

export PATH=.:/usr/local/bin:/usr/local/sbin:/usr/local/narwhal/bin:/bin:/sbin:/usr/bin:/usr/local/share:/usr/sbin:/usr/local/texlive/2011/bin/universal-darwin
export EDITOR='open -Wn'
export LC_TYPE=en_US.UTF-8
export LSCOLORS=exFxcxdxAxexbxHxGxcxBx

# -----------------------------------------------
# Prompt
# -----------------------------------------------

## Root Prompt
[ $UID = 0 ] && export PROMPT="%~ +=> " && export RPROMPT="%*"

## General Prompt
[ $UID != 0 ] && export PROMPT="%~ => " && export RPROMPT="%*"

# -----------------------------------------------
# Aliases
# -----------------------------------------------

## Command Aliases
alias ..='cd ..'
alias ...='cd ../..'
alias internet='lsof -P -i -n | cut -f 1 -d " " | uniq'
alias restart='sudo shutdown -r NOW'
alias ls='ls -@1AFGph'
alias tree='tree -alCF --charset=UTF-8 --du --si'
alias mate='mate -w'
alias zshrc='$EDITOR ~/.zshrc && source ~/.zshrc'
alias vimrc='$EDITOR ~/.vimrc.local'
alias gvimrc='$EDITOR ~/.gvimrc.local'

## Root Aliases
[ $UID = 0 ] && \
    alias rm='rm -i' && \
    alias mv='mv -i' && \
    alias cp='cp -i'

# -----------------------------------------------
# User-defined Functions
# -----------------------------------------------

# Usage: extract <file>
# Description: extracts archived files / mounts disk images.
# Note: .dmg/hdiutil is Mac OS X-specific.
extract () {
    if [ -f $1 ]; then
        case $1 in
            *.tar.bz2)  tar -jxvf $1        ;;
            *.tar.gz)   tar -zxvf $1        ;;
            *.bz2)      bunzip2 $1          ;;
            *.dmg)      hdiutul mount $1    ;;
            *.gz)       gunzip $1           ;;
            *.tar)      tar -xvf $1         ;;
            *.tbz2)     tar -jxvf $1        ;;
            *.tgz)      tar -zxvf $1        ;;
            *.zip)      unzip $1            ;;
            *.Z)        uncompress $1       ;;
            *)          echo "'$1' cannot be extracted/mounted via extract()." ;;
        esac
    else
        echo "'$1' is not a valid file."
    fi
}


# Usage: pman <manpage>
# Description: opens up the selected man page in Preview.
pman () {
    man -t $@ | open -f -a /Applications/Preview.app
}

# Usage: fp <name>
# Description: find and list processes matching a case-insensitive partial-match string.
fp () {
    ps Ao pid,comm|awk '{match($0,/[^\/]+$/); print substr($0,RSTART,RLENGTH)": "$1}'|grep -i $1|grep -v grep
}

# Usage: fk <name>
# Description: find and kill a process matching a case-insensitive partial-match string.
fk () {
    IFS=
\n'
    PS3='Kill which process? (1 to cancel): '
    select OPT in "Cancel" $(fp $1); do
        if [ $OPT != "Cancel" ]; then
            kill $(echo $OPT|awk '{print $NF}')
        fi
        break
    done
    unset IFS
}

# Usage: create <file>
# Description: creates and opens a file for editing.
create () {
    touch $1 && open $1
}

# Usage: reset
# Description: 'resets' the terminal by changing the current working directory
# to the desktop and clearing the screen.
reset () {
    cd ~/Desktop; clear
}

# Usage: quit
# Description: exits the terminal.
quit () {
    killall Terminal
}

# -----------------------------------------------
# zsh Options
# -----------------------------------------------

# Directories
setopt                  \
    AUTO_CD             \
    AUTO_PUSHD          \
    CD_ABLE_VARS        \
    CHASE_DOTS          \
    CHASE_LINKS         \

# Completion
setopt                  \
    AUTO_LIST           \
    AUTO_MENU           \
    AUTO_PARAM_SLASH    \
    COMPLETE_IN_WORD    \
    LIST_TYPES          \
    MENU_COMPLETE       \
    REC_EXACT           \

# History
setopt                  \
    APPEND_HISTORY      \
    EXTENDED_HISTORY    \

# Input/Output
setopt                  \
    CORRECT             \

# Scripts and Functions
setopt                  \
    MULTIOS             \

# Other
setopt                  \
    NO_BEEP             \
    ZLE

# Key Bindings
bindkey "^[[3~" delete-char

# -----------------------------------------------
# zsh Autocompletion
# -----------------------------------------------

# Turn on auto-completion.
autoload -U compinit && compinit -C && autoload -U zstyle+

# Attempt to complete as much as possible.
zstyle ':completion:*' completer _complete _list _oldlist _expand _ignored _match _correct
zstyle ':completion:*::::' completer _expand _complete _ignored _approximate

# Sort files by name.
zstyle ':completion:*' file-sort name

# Allow for case-insensitive completion.
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'

# Color completions.
zstyle ':completion:*' list-colors ${LSCOLORS}
zstyle ':completion:*:*:kill:*:processes' command 'ps -axco pid,user,command'
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31'

# Set the amount of completions that triggers the menu.
zstyle ':completion:*' menu select=long

# Ignore certain patterns.
zstyle ':completion:*:functions' ignored-patterns '_*'
zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~'
zstyle ':completion:*:*:(^rm):*:*files' ignored-patterns '*?.(o|c~|old|pro|zwc)'

# Cache completions.
zstyle ':completion::complete:*' use-cache 1
zstyle ':completion::complete:*' cache-path ~/.zcompcache/$HOST

# Allow errors.
zstyle -e ':completion:*:approximate:*' max-errors 'reply=( $(( ($#PREFIX+$#SUFFIX)/2 )) numeric )'

# Insert all expansions for expand completer (eh, don't know what this does).
zstyle ':completion:*:expand:*' tag-order all-expansions

# Formatting and messages.
zstyle ':completion:*' list-prompt '%SAt %p: Hit TAB for more, or the character to insert%s'
zstyle ':completion:*' verbose yes
zstyle ':completion:*:descriptions' format '%B%d%b'
zstyle ':completion:*:messages' format '%d'
zstyle ':completion:*:warnings' format 'No matches for: %d'
zstyle ':completion:*:corrections' format '%B%d (errors: %e)%b'
zstyle ':completion:*' group-name ''

# Offer indexes before parameters in subscripts.
zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

网名女生简单气质 2024-12-25 07:59:33

在 zsh 中,当您编写 $EDITOR 时,它会扩展为单个单词。与其他 Bourne 风格的 shell 不同,zsh 在扩展未加引号的扩展时不会分割单词。您可以通过
= 参数扩展修饰符

$=EDITOR $file

更可移植的方法是确保 EDITOR 不包含任何空格。大多数应用程序将 $EDITOR 视为 shell 片段或以空格分隔的单词列表,但我遇到过一些将其视为命令名称的应用程序。使 EDITOR 指向 shell 脚本。

% cat ~/bin/EDITOR
#!/bin/sh
open -Wn -- "$@"
% grep EDITOR ~/.profile
export EDITOR=~/bin/EDITOR

In zsh, when you write $EDITOR, it expands to a single word. Unlike other Bourne-style shells, zsh does not split words when it expands unquoted expansions. You can make it happen with the
= modifier on parameter expansion.

$=EDITOR $file

A more portable method is to ensure that EDITOR does not contain any space. Most applications treat $EDITOR as a shell snippet or as a whitespace-separated list of words, but I've encountered a few that treat it as a command name. Make EDITOR point to a shell script.

% cat ~/bin/EDITOR
#!/bin/sh
open -Wn -- "$@"
% grep EDITOR ~/.profile
export EDITOR=~/bin/EDITOR
岁吢 2024-12-25 07:59:33

你如何调用编辑器?如果您使用选项设置了编辑器,那么您会收到以下错误:

$ $EDITOR file

但如果您这样做,它应该可以工作:

$ eval $EDITOR file

How are you invoking the EDITOR? If you have EDITOR set with options, then you would get an error with:

$ $EDITOR file

but it should work if you do:

$ eval $EDITOR file
小猫一只 2024-12-25 07:59:33

调用 $EDITOR 定义的编辑器的程序可能会假设它引用的整个字符串是命令的名称。因此他们会尝试找到一个名为open -Wn的可执行文件。

另一个问题是 open 仅使用操作系统认为合适的应用程序打开文件。如果没有与该文件类型关联的应用程序,该命令将失败。

Programs that invoke the editor defined by $EDITOR may assume that the whole string referenced by it is the name of the command. So they will try to find an executable file called open -Wn.

Another issue is that open merely opens the file with an application that the operating system deems appropriate. If there is no application associated with the file type, the command will fail.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文