Questions tagged «zsh»

Zsh是具有许多高级命令行和脚本功能的shell。

4
为什么cut用bash而不是zsh失败?
我用制表符分隔的字段创建一个文件。 echo foo$'\t'bar$'\t'baz$'\n'foo$'\t'bar$'\t'baz > input 我的以下脚本名为 zsh.sh #!/usr/bin/env zsh while read line; do <<<$line cut -f 2 done < "$1" 我测试一下。 $ ./zsh.sh input bar bar 这很好。但是,当我将第一行更改为调用时bash,它将失败。 $ ./bash.sh input foo bar baz foo bar baz 为什么这会失败bash并起作用zsh? 其他疑难解答 在shebang中使用直接路径而不是env产生相同的行为。 用管道echo代替而不使用here-string <<<$line也会产生相同的行为。即echo $line | cut -f 2。 使用awk的,而不是cut 作品的两个壳。即<<<$line awk '{print …

3
如何实现$ RANDOM之类的“生成器”?
$RANDOM每次访问时,特殊变量都有一个新值。在这方面,它使人联想到某些语言中的“生成器”对象。 有没有办法实现这样的事情zsh? 我尝试使用命名管道执行此操作,但是我没有找到一种在不终止“ generator”进程的情况下以受控方式从fifo提取项目的方法。例如: % mkfifo /tmp/ints % (index=0 while ( true ) do echo $index index=$(( index + 1 )) done) > /tmp/ints & [1] 16309 % head -1 /tmp/ints 0 [1] + broken pipe ( index=0 ; while ( true; ); do; echo $index; index=$(( ... 还有其他方法可以在zsh中实现这种生成器类型的对象吗? 编辑:这不起作用: …
10 zsh  fifo  ipc 

2
用其协同进程/子进程替换当前进程
我有一个程序P,期望接收“你好”并输出“为什么?” 在提供功能之前。其他不知道通常与“ Hello”开始对话的程序使用此功能。因此,我想为此编写一个包装器P(zsh语法): coproc P print -p Hello # Send Hello to P read -pr line # Read what P has to say [[ "$line" = "Why?" ]] && Replace current process with the coprocess. echo Could not get P's attention. 在部分中使用cat或会导致不必要的缓冲。我有什么选择?ddReplace...cat <&p &; exec cat >&p
10 shell  scripting  process  zsh 

4
我可以在“ &&”之后的“ &&”之前引用命令吗?
不知道如何用其他方式表达问题,但是基本上,我经常发现自己正在运行一个命令,例如vagrant启动虚拟机,然后像下面这样使用ssh进入该命令: vagrant up && vagrant ssh 除了编写自己的函数或脚本之外,还有没有办法“重用” vagrant命令第二部分中的部分?
10 bash  zsh 

2
将脚本输出的副本发送到文件
假设我有一个Zsh脚本,我想让它将输出打印到STDOUT,而且还要将其输出复制(转储)到磁盘上的文件中。 此外,脚本以以下选项开头 set -o xtrace 这迫使它变得冗长,并打印它运行的命令。我也想在磁盘上的文件中捕获此输出。 我的理解是,如果我这样做 ./my_script.sh > log.txt 它只会发送STDOUT到log.txt,但是如果我也希望能够在终端中看到输出怎么办? 我已经阅读了Zsh中的tee和MULTIOS选项,但是不确定如何使用它们。 当我做: ./my_script | tee log.txt 我可以在终端上看到输出,但是该文件log.txt似乎无法捕获所有内容(实际上它几乎捕获不到任何内容)。

2
zsh中的局部变量:zsh中bash的“ export -n”等效项是什么
我正在尝试在zsh中将变量的范围包含到shell中,而没有孩子看到它。例如,我在.zshrc中键入: GREP_OPTIONS=--color=always 但是,如果我使用以下命令运行shell脚本: #!/bin/bash echo $GREP_OPTIONS 输出为: --color=always 虽然我希望它为null(上面的shell脚本根本不应该看到GREP_OPTIONS变量)。 用bash可以说:export -n GREP_OPTIONS=--color=always,这可以防止这种情况的发生。如何在zsh中完成此操作?


4
Shell脚本中的混合代码。共享变量
该答案讨论了如何从终端中的命令行运行多行Python代码段。我注意到,即使在嵌套缩进的情况下,答案在shell脚本中也非常有效,例如, #!/bin/bash some_text="Hello world" echo $some_text cat <<EOF | python - import sys; for r in range(3): print r for a in range(2): print "hello" EOF 印刷品: 0 hello hello 1 hello hello 2 hello hello 但是,我很难在Shell脚本和Python代码段之间共享变量。 如何在bash脚本中收集python下标的输出?(例如,在变量中$output)。 如何将bash变量(例如$some_text)传递给Python脚本?
10 bash  scripting  zsh  python 

1
zsh完成:从特定目录获取文件名
好的,有一点背景知识:我使用的是Mac,并且在CLI中做了很多事情。 特别是,我经常弹出USB记忆棒cp或mv文件,然后立即希望弹出(卸载和断开连接)它。通常,可以通过几次击键来完成操作,除了进行卸载外,这需要(在10.7中)进入一个空的桌面空间(通常至少两个空间),选择磁盘,然后按“ command-e”。坦白地说,这种卸载过程是该过程中最耗时且最繁琐的部分,数量级高。 只需键入以下内容,这将更加自然和有效: ej<tab> J<tab> 说我的USB记忆棒安装在/ Volumes / Jefferson。我希望从6次击键中得到以下结果: eject /Volumes/Jefferson 这应该运行以下命令: diskutil unmount /Volumes/Jefferson 因此,我编写了一个不错的小函数: eject() { diskutil unmount /Volumes/$1 } 还有一个完成功能: compdef '_files -g "/Volumes/*"' eject 但是,这有一个问题。该_files函数生成完整的路径。现在,我可以将“ eject”函数中的行更改为diskutil unmount $1,一切都会正常进行,但是由于路径以/ Volumes /开头,所以我无法键入安装点名称的第一个字母。例如,如果键入J<tab,我将为PWD中的文件自动补全。我将不得不键入/Volumes/J<tab>以获得所需的完成。 因此,是否有一个完成功能可以从预定义的特定位置获取文件名,而不是生成完整路径? 我真的很想把这个减少到6次击键。
10 zsh  osx  autocomplete 

3
zsh像emacs一样复制和粘贴
我注意到zsh在emacs中有很多东西。我可以使用ctrl + space进行选择并选择一个区域。当我停留在zsh中时,可以像在emacs中一样进行复制。在emacs中,我可以使用系统剪贴板(以前需要一些其他配置,但这在emacs中是开箱即用的)。在zsh中,我似乎无法使用Cy从剪贴板粘贴,并且从zsh复制到系统cliipboard也有相同的问题。有没有解决的办法?
10 zsh  clipboard 

2
取消zsh选项卡完成
启动完成后,是否可以取消它?有时我愚蠢地按Tab键以自动完成制作目标(仅出于纯粹的惰性),然后最终不得不等待更长的时间,而不是我自己输入整个“安装”或“签出”的时间。 在zshzle手册页中没有看到任何值得注意的内容,但是也许我错过了一些东西吗?是否有其他外壳具有此功能? 编辑:平凡的答案。因此,相反:zsh是否有一种方法可以估计制表符补全将花费相对较长的时间来执行,而是询问用户是否希望这样做?
10 zsh  autocomplete 

2
在zsh中列出带有空格的元素
在这一点上,我已经学习了2个小时的所有zsh脚本,并且碰壁了。我想查看其中可能包含空格的文件列表。我愿意接受与以下示例完全不同的方法,只要它们是zsh,因为zsh是我正在研究的内容,而不是我要编写的任务。 files=(`ls`) for f in $files; do print $f done 我显然不只是在重新创建ls,我只是想$f在循环的每次迭代中捕获整个文件名。
10 shell  scripting  zsh 

1
zsh中的FPATH:功能和站点功能
我注意到我的.zshrc文件开头附近有以下行: export FPATH=/usr/share/zsh/site-functions:/usr/share/zsh/4.2.6/functions:$FPATH 我不记得是我自己输入的还是这行是由自动生成的 zsh-newuser-install。 是否假定用户FPATH在启动文件中键入了这些路径?functions和之间有什么区别site-functions?
10 zsh 

2
在zsh中测试LS_COLORS
几年前我发现了一个有趣的代码片段,该片段根据在中设置的颜色以相应的颜色打印每种文件类型LS_COLORS。不幸的是,我不再记得链接了。 这是有test_colors.sh问题的代码段 eval $(echo "no:global default;fi:normal file;di:directory;ln:symbolic link;pi:named pipe;so:socket;do:door;bd:block device;cd:character device;or:orphan symlink;mi:missing file;su:set uid;sg:set gid;tw:sticky other writable;ow:other w\ ritable;st:sticky;ex:executable;"|sed -e 's/:/="/g; s/\;/"\n/g') { IFS=: for i in $LS_COLORS do echo -e "\e[${i#*=}m$( x=${i%=*}; [ "${!x}" ] && echo "${!x}" || echo "$x" )\e[m" done } 该代码段在中效果不错bash,但在中效果不佳,zsh我也不知道为什么。当我运行它时,zsh出现以下错误: > sh .test_colors.sh .eval_colors:1: …
10 zsh  ls  colors 

1
如何获取我的Shell函数以利用zsh中的现有自动完成功能?
我定义了几个shell函数,.zshrc这些函数可以节省键入并允许与屏幕集成。例如: function s() { screen -t "$1" ssh "$@" } 但是,当我使用这些Shell函数时,我无法利用zsh的内置命令完成功能。(对于SSH,将基于known_hosts和ssh_config自动完成主机名)。挂接到我为之创建包装器的命令的现有完成机制上的首选方法是什么? 编辑: 感谢Gilles在下面的回答。使用compdef似乎是实现此目的的方法,但有趣的是,它似乎无法统一工作。在这种情况下,我具有以下设置: function s() { screen -t "$1" ssh "$@" } function m() { screen -t "man.$1" man "$1" } compdef $_comps[man] m compdef $_comps[ssh] s 包装函数'm'的完成按预期工作,但是函数's'的完成不起作用;而不是尝试完成主机名,它可以通过单击“制表符”时向我提供文件列表来回退到默认的自动完成功能。SSH完成的处理方式是否有些奇怪,这意味着我需要做进一步的事情?
10 zsh  autocomplete 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.