Fish Shell 怎么获得上一条历史命令?

~ $ echo \
    hello
hello
~ $ history | head -1
echo \

不支持换行。

~ $ echo \
    hello
hello
~ $ history --null | ghead --lines=1 --zero-terminated
echo \
hello

依赖 GNU Coreutils。大家知不知道有没有别的方案?用标准的工具,AWK/Sed/Perl 之类的。

⋊> echo \
   hello \
   world
hello world

⋊> history --null -1 | xargs -0
echo \
hello \
world

Fish 的 history 不支持 -1 如果支持的话,直接 history -1 应该就完了。我简单试了下 Bash/Zsh,发现只有 Zsh 支持 -N

1 个赞

history | tail -n 2 | head -n 1

1 个赞

echo $history[1]

2 个赞

我用的就是 fish,难道最近改了?

⋊> fish --version
fish, version 2.7.1-645-g0a4883a6

⋊> man history | xargs -0 | head -1
history(1)                           fish                           history(1)

-1--max=1 的简写:

⋊> history --help | ag '\-\-max'
       history search [ --show-time ] [ --case-sensitive ] [ --exact | --prefix | --contains ] [ --max=n ] [ --null ] [ -R | --reverse ] [ 'search string'... ]
       · -<number> -n <number> or --max=<number> limits the matched history

另外,如果只用 -1,会进入交互模式,所以需要 | xargs -0

1 个赞

的确可以。文档没有提到有 history 这个变量,这对新手不友好。

我用的是 fish 2.7.1,又看了下 manpage,的确支持 -1 ,但是似乎没什么用,因为只能用于搜索。

   o -<number> -n <number> or --max=<number> limits the matched history items to the first 'n'
     matching entries. This is only valid for history search.
⋊> history --null -1 | xargs -0              # 整个历史的最后一条
⋊> history search 'foo' --null -1 | xargs -0 # 搜索结果的最后一条