在zsh函数中意外没有这样的文件错误

时间:2017-09-18 21:07:06

标签: zsh

我已在zsh中定义了此功能,但它无法在我的计算机上运行。

function m() {
    local path=/Users/james/Music/cloud_music_link
    local cmd="ls $path | sed -n $1p"
    echo `$cmd`
    # afplay `$cmd`
}

总是说:

  

m:3:没有这样的文件或目录:ls / Users / james / Music / cloud_music_link | sed -n 10p

当我复制ls /Users/james/Music/cloud_music_link | sed -n 10p并在zsh中运行时,一切正常,为什么会发生这种情况?

文件夹cloud_music_link是一个软链接,我不确定这是否重要。

2 个答案:

答案 0 :(得分:1)

您希望先将给定目录内某个位置的文件(或子目录)传递给echo,然后传递给aplay?以与bash和zsh兼容的方式轻松完成:

m() {
    local num=${1:-1}
    local dir=/Users/james/Music/cloud_music_link
    local -a files=( "$dir"/* )
    local file=${files[$(( num - 1 ))]}
    echo "$file"
    afplay "$file" &
}

请参阅:

答案 1 :(得分:0)

最后我已经弄明白了,这是因为变量path的名称,我将其更改为p,一切正常。名称path将与zsh冲突。

此代码有效:

function m() {
    local p=/Users/james/Music/cloud_music_link/
    song="$(ls $p | sed -n $1p)"
    echo $song
    killall afplay 
    afplay "$p$song"&
}