别名在脚本中丢失

时间:2017-01-20 13:04:46

标签: bash macos shell

当程序在mac上运行时,我想将gnu-date gdate别名为date

#!/bin/bash
if [[ $(uname) -eq 'Darwin' ]]; then
    alias date="gdate"
    echo 'you are on a mac!'
    type date
fi
# rest of the program

鉴于此代码,如果我直接在终端上运行int,则打印:

you are on a mac!
date is an alias for gdate

但是如果我在print中运行脚本本身就像./test.sh那样:

you are on a mac!
date is /bin/date

为什么没有从脚本中应用别名?

2 个答案:

答案 0 :(得分:6)

默认情况下,别名不会在非交互式shell中展开。改为使用函数。

if [[ $(name) -eq Darwin ]]; then
   date () { gdate "$@"; }
   echo 'you are on a mac!'
   type date
fi

答案 1 :(得分:2)

在许多情况下,使用函数是正确的解决方案。只要您有基于功能的解决方案,就可以这样做。

但是,有一些功能你无法做到,最明显的是与修改调用上下文的位置参数有关,你可以通过启用相应的选项强制在shell脚本中进行别名扩展:

<Grid Height="20" HorizontalAlignment="Left" Background="MediumPurple">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="20" MinWidth="20"/>
    </Grid.ColumnDefinitions>

    <TextBlock Grid.Column="0" HorizontalAlignment="Stretch" x:Name="TestTitle"
           TextTrimming="CharacterEllipsis" FontSize="16"/>

    <Ellipse Width="20" Height="20" Fill="Red" Grid.Column="1" HorizontalAlignment="Left"/>

</Grid>

您必须了解并控制脚本中存在的别名,以避免意外行为。