我正在试用来自zsh和bash的鱼壳。我非常想念$history
位置参数,并试图用函数模仿它。
Fish在$history[1]
数组中包含其命令历史记录,其中$history[2]
是历史记录中的上一行,ls -al
echo $history[1] | awk '{print $NF}' // Prints -al
是之前的那一行,依此类推。
我正在尝试评估此变量并提取最后一个单词
function \$_ --description 'Fish-patch for the $_ positional parameter'
echo $history[1] | awk '{print $NF}'
end
我试过把它放在像这样的函数中
$_
但它并没有像预期的那样奏效。单独调用ls -al
$_
按预期工作;
-al
打印$_
。但是如果将ls -al
echo $_
作为参数传递给函数;
echo
打印$_
。我怀疑它与echo $_
- 在子shell或其他东西中被评估的函数有关,我真的不知道。
这里有什么问题?为什么j2objc-0.9.8.2.1/include/J2ObjC_header.h:25:17: error: cannot create __weak reference in file using manual reference counting
id JreStrAppend(__weak id *lhs, const char *types, ...);
没有按预期工作?
答案 0 :(得分:4)
在fish中,$_
是一个包含最后一个前台作业的只读变量。但是,您可以使用$__
或其他角色。
最简单的选择是在每个命令后更新$__
:
function update_last_arg --on-event fish_postexec
set -g __ (echo $argv | awk '{print $NF}')
end
现在$__
将始终包含最后一个参数。
答案 1 :(得分:0)
因为鱼没有全局别名。你给echo
的参数只是字符串,它们不会被评估为代码。
你必须这样做,这会降低它的可用性。
echo ($_)
我找到了(某处)实现bash历史记录的方法,如!!
和!$
:
function fish_user_key_bindings
bind ! bind_bang
bind '$' bind_dollar
# enable editing command line in editor with Alt+v
bind \ev bind_edit_commandline
end
function bind_bang
switch (commandline -t)[-1]
case "!"
commandline -t $history[1]; commandline -f repaint
case "*"
commandline -i !
end
end
function bind_dollar
switch (commandline -t)[-1]
case "!"
commandline -t ""
commandline -f history-token-search-backward
case "*"
commandline -i '$'
end
end