打开gnome终端并执行用户定义的zsh命令

打开gnome终端并执行用户定义的zsh命令

我想要一个命令来打开终端并执行我的aliases.zsh.该函数的定义如下:

my-function() {
  wget some stuff
  do some other stuff
}

我尝试过gnome-terminal -- my-function,但新终端报告了这一点Failed to execute child process “my-function” (No such file or directory)。如果我这样做,也会发生类似的情况gnome-terminal -- /bin/zsh -c 'my-function; sleep 1; exec zsh':在新终端中,zsh 报告zsh:1: command not found: my-function

非常感谢任何帮助。

答案1

~/.zshrc是交互式调用的自定义文件zsh

zsh -c 'some code'是一个内联脚本。就像以#! /bin/zsh -shebang 开头的脚本一样,幸运的是,它~/.zshrc不是在启动时获取的。如果是,并且您有别名/函数可以更改标准命令的行为(这种情况并不罕见alias 'ls=ls --color -F' 'grep=grep --color;......),则可能会破坏 zsh 脚本。

如果您希望加载脚本~/.zshrc~/.zprofile/etc/zsh/zshrc,您需要显式请求它。但最好的办法是将这些函数放在一些函数中~/.zsh/some-library.zsh,并将其放在需要它的脚本以及您的脚本中~/.zshrc,或者使用autoload框架。

gnome-terminal -- zsh -c '. ~/.zsh/some-library.zsh; myfunction'

如果您想要启动交互式 zsh gnome-terminal,但在发出第一个提示之前首先运行您的函数,您可以添加:

eval -- $ZSH_INIT_COMMAND
unset ZSH_INIT_COMMAND

到你的末尾~/.zshrc,然后运行gnome-terminal

gnome-terminal -- env ZSH_INIT_COMMAND='myfunction; echo and whatever else' zsh

或者,如果您想像在提示符下编写一样启动它,这样您就可以以相同的方式处理它,请将其更改为:

if (( $+ZLE_INIT )); then
  seed-zle() {
    BUFFER=$ZLE_INIT
    unset ZLE_INIT
    zle -D zle-line-init
    unset -f seed-zle
    zle accept-line
  }
  zle -N zle-line-init seed-zle
fi

并启动 gnome-terminal:

gnome-terminal -- env ZLE_INIT='myfunction; echo and whatever else' zsh

相关内容