Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 将通配符传递给别名_Shell_Unix_Ksh - Fatal编程技术网

Shell 将通配符传递给别名

Shell 将通配符传递给别名,shell,unix,ksh,Shell,Unix,Ksh,我使用修改列表命令作为别名(在KSH中): alias ltf='ls-lrt-d-1$PWD/*' 因此,命令ltf显示如下内容: -rw-r--r--1我的用户我的组0 4月18日12:00/usr/test.txt -rw-r--r--1 myuser mygroup 0 Apr 18 12:00/usr/test.log 现在我想使用通配符。但是使用ltf*.log不起作用 实现这一目标的最佳方式是什么 更新:我想指定我的问题,因为答案到目前为止还不能解决我的问题:命令ls-lrt-d

我使用修改列表命令作为别名(在KSH中):

alias ltf='ls-lrt-d-1$PWD/*'

因此,命令
ltf
显示如下内容:

-rw-r--r--1我的用户我的组0 4月18日12:00/usr/test.txt

-rw-r--r--1 myuser mygroup 0 Apr 18 12:00/usr/test.log

现在我想使用通配符。但是使用
ltf*.log
不起作用

实现这一目标的最佳方式是什么


更新:我想指定我的问题,因为答案到目前为止还不能解决我的问题:命令
ls-lrt-d-1$PWD/*
执行一个带有一些选项的列表命令,并显示完整路径,这对我来说很重要

不幸的是,别名方法不允许使用通配符参数。我的目标是使这成为可能。可能这是将命令创建为函数的最佳方式。答案中提到了这一点,但它还不起作用(见评论)


有什么想法吗?

使用shell函数而不是别名:

function ltf {
  if [ -z "$1" ]; then
    ls -lrtd1 ${PWD}/*
  else
    ls -lrtd1 $1
  fi
}
试一试

或者如果你想要很多参数

alias ltf='ls -lrt -d -1 $@'

您的问题是,通配符是由当前目录中的shell扩展的,而不是在$PWD中。您可以通过使用shell函数而不是别名并进行一些引用(为了方便起见,我在示例中使用$HOME)来解决此问题。请将其放入.bashrc:

ltf() {
    ls $HOME/$*
}
然后:

$ ltf '*.log'

正如其他人所提到的,通配符扩展是在调用shell函数之前完成的,但对于别名则不是这样

如果您不需要更改输入(OP会这样做),这将很好:

alias ltf='ls -lrt -d -1'
要实现OP想要的功能,在shell函数中,您需要使用
$@
操作符来访问由通配符扩展产生的文件集,然后您需要预先添加:

ltf() 
{ 
    #Prepend $PWD to the start of every input
    set -- "${@/#/$PWD/}"   

    #Run the command on the prepended input
    ls -lrt -d -1 $@;
}

出于兴趣,在ksh中是否有类似于bash的符号:
[[-z“$1”]&&ls-lrtd1“$PWD/*”|ls-lrtd1“$1”
我认为在else语句之后应该是
ls-lrtd1${PWD}/$1
。谢谢@TechnoCore:no.
[-z“$1”]
如果
“$1”
是空字符串,即没有参数,则为true。如果有参数,也应执行PWD命令
ls-lrtd1$1
没有显示完整路径经过一些测试后,我认为这种方法无法解决问题。如果通配符(例如.*.log)返回多个文件,则
ltf*.log
只列出一个文件。这不起作用,
$1
等不会被别名识别。无论如何,您可能会得到结果的原因是,
$1
将是一个空字符串,因此
ltf路径
将是
ls-lrt-d-1路径
。因此,您应该使用别名ltf='ls-lrt-d-1'以获得相同的效果,如果这不起作用,则需要使用函数。
ltf() 
{ 
    #Prepend $PWD to the start of every input
    set -- "${@/#/$PWD/}"   

    #Run the command on the prepended input
    ls -lrt -d -1 $@;
}