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
Bash 如何创建参数在中间的别名?_Bash_Unix_Shell_Alias_Sh - Fatal编程技术网

Bash 如何创建参数在中间的别名?

Bash 如何创建参数在中间的别名?,bash,unix,shell,alias,sh,Bash,Unix,Shell,Alias,Sh,我试图定义一个别名,其中参数插入中间,而不是追加到结尾。 我试着这样定义它: alias grep_logs="grep $1 */log/*.log" 其中$1是grep_日志的第一个参数,如下所示: grep_logs foo 将执行以下命令: grep foo */log/*.log 但它会运行以下命令: grep foo */log/*.log foo 这会导致错误: grep: foo: No such file or directory 是否可以使用别名执行此操作,或者我需

我试图定义一个别名,其中参数插入中间,而不是追加到结尾。

我试着这样定义它:

alias grep_logs="grep $1 */log/*.log"
其中$1是grep_日志的第一个参数,如下所示:

grep_logs foo
将执行以下命令:

grep foo */log/*.log
但它会运行以下命令:

grep foo */log/*.log foo
这会导致错误:

grep: foo: No such file or directory

是否可以使用别名执行此操作,或者我需要定义一个函数?

不是您想要的答案,但是如果不想将模式指定为第一个参数,请使用
-e
参数

alias grep_logs="grep */log/*.log -e"

尝试使用函数,然后对其进行别名:

function func_grep_logs {
    grep $1 */log/*.log
}
然后


尝试在~/.profile中定义函数

function greplogs(){
    grep "$1" */logs/*.log
}

问题是别名不支持位置参数的概念。如果有,我们就不需要函数了。所以,是的,使用函数,因为函数正是为此目的而创建的

只是为了回答这个问题,虽然函数解决方案更简洁:

alias sstatus='bash -xc '\''sudo service $0 status'\'''
alias sstart='bash -xc '\''sudo service $0 start'\'''
alias sstop='bash -xc '\''sudo service $0 stop'\'''


$sstatus cups
+ sudo service cups status
Status of Common Unix Printing System: cupsd is running.
扩展到目前为止,这是唯一一个真正回答这个问题的方法:

别名
参数 Shell别名不接受参数,但仅在末尾:

通过
alias
将参数放在命令中间确实是可能的,但它会变得丑陋

孩子们,别在家里试这个! 如果你喜欢规避限制,做别人说不可能的事,这里有个秘诀。只要别怪我,如果你的头发被磨得干干净净,你的脸最终被烟熏疯了的科学家风格所覆盖

解决方案是通过以下的参数:<代码>别名< /> >只接受一个包装器,将在中间插入,然后执行命令。< /P> 解决方案1 如果您确实反对使用函数本身,您可以使用:

$ alias wrap_args='f(){ echo before "$@" after;  unset -f f; }; f'
$ wrap_args x y z
before x y z after
如果只需要第一个参数,可以将
$@
替换为
$1

解释1

这将创建一个临时函数
f
,并将参数传递给它(请注意,
f
在最后被调用)。在执行别名时,
unset-f
会删除函数定义,这样之后它就不会挂起

解决方案2 您还可以使用子shell:

$ alias wrap_args='sh -c '\''echo before "$@" after'\'' _'
解释2

alias生成的命令类似于:

sh -c 'echo before "$@" after' _
评论:

  • 占位符
    \uu
    是必需的,但它可以是任何内容。它被设置为
    sh
    $0
    ,并且是必需的,以便不使用用户给定的第一个参数。演示:

    sh -c 'echo Consumed: "$0" Printing: "$@"' alcohol drunken babble
    Consumed: alcohol Printing: drunken babble
    
  • 单引号中的单引号是必需的。下面是一个不使用双引号的示例:

    $ sh -c "echo Consumed: $0 Printing: $@" alcohol drunken babble
    Consumed: -bash Printing:
    
    在这里,交互shell的
    $0
    $@
    的值被替换为双引号,然后传递给
    sh
    。以下是证据:

    echo "Consumed: $0 Printing: $@"
    Consumed: -bash Printing:
    
    单引号确保这些变量不会被交互式shell解释,而是直接传递给
    sh-c

    您可以使用双引号和
    \$@
    ,但最佳做法是引用您的参数(因为它们可能包含空格),
    \“\$@\”
    看起来更难看,但可能有助于您赢得一场混淆比赛,在这场比赛中,疲惫的头发是参赛的先决条件


可以制作一个超级简单的python脚本来实现自动化,您尝试过吗?(提示:您必须使用sys.argv)而不是别名,编写一个函数。为什么不
grep“$1”*/log/*.log
?那么别名的好处是什么呢?正确的答案是别名是错误的答案,而函数则是正确的答案。声明中的函数名后面是no()?如果要传递多个参数,可以使用
${@:1}
而不是
“$1”
,它将在那里插入所有参数。对于需要中间有参数的别名的人来说是有用的。要注意,你不需要使用<代码>函数< /> >,你可以从<代码> GRPPLOG()开始。{。此外,如果您确实使用
函数
,它将在ksh中中断。如何调用传递参数的函数?@Pijusn为什么不
$
?尽管显然
${:2}
有助于跳过第一个参数。@piojo您是对的,它们是相等的(AFAIK)。不确定我为什么不只是建议
$
$ sh -c "echo Consumed: $0 Printing: $@" alcohol drunken babble
Consumed: -bash Printing:
echo "Consumed: $0 Printing: $@"
Consumed: -bash Printing: