【问题标题】:Bash aliasing not replacing as expectedBash 别名没有按预期替换
【发布时间】:2017-09-23 03:57:25
【问题描述】:

我正在尝试为 S3 存储桶的名称设置别名,以便在传输文件时不必不断输入它。

在我的 .bash_profile 中:

alias as3="aws s3"
alias artifacts="s3://dev-artifacts-bucket-name"
alias admin="--profile admin-user"

使用别名的示例所需命令:

as3 cp localFile.txt artifacts/ admin

应该解析为:

aws s3 cp localFIle.txt s3://dev-artifacts-bucket-name/ --profile admin-user

其中“admin-user”是在我的 ~/.aws/config 文件中配置的 IAM 角色的名称。

相反,我得到了错误:

as3 cp ./upload.sh artifacts/ admin

Unknown options: admin

或者当我删除配置文件别名时

as3 cp ./upload.sh artifacts/ --profile admin-user

usage: aws s3 cp <LocalPath> <S3Uri> or <S3Uri> <LocalPath> or <S3Uri> <S3Uri>
Error: Invalid argument type

错误消息清楚地显示了第一个别名工作,因为我收到“aws s3”使用错误,但第二个别名没有被触发。尝试使用 set -x 进行调试,得到:

as3 cp upload.sh artifacts admin
+ aws s3 cp upload.sh artifacts admin

除非 bash 检测到递归别名替换并用一个钝错误停止它,否则我对所发生的事情不知所措。

仅供参考:我自称是 bash 菜鸟,请保持温和。 (是的,我采购了 .bash_profile)

【问题讨论】:

    标签: bash


    【解决方案1】:

    您将 Bash 中的 alias 与变量混淆了。 alias 只能用作命令的开头。

    参数可以是变量:

    alias as3="aws s3"
    artifacts="s3://dev-artifacts-bucket-name"
    admin="--profile admin-user"
    

    那么你可以:

    as3 cp localFile.txt $artifacts/ $admin
    

    【讨论】:

    • 我会使用as3 cp localFile.txt "${artifacts}/" "${admin}"
    • $admin 不能被引用,因为它包含两个作为单独参数的单词。两个变量都不需要导出,但 admin 要么不加引号,要么替换为数组 admin=(--profile admin-user),后跟 as3 cp localFile.txt "$artifacts/" "${admin[@]}"
    【解决方案2】:

    与其定义几个单独的变量,不如定义一个函数来包装整个命令:

    upload_as_admin () {
        aws s3 cp "$1" s3://dev-artfacts-bucket-name --profile admin-user
    }
    

    要使用它,请将要上传的文件作为参数传递:

    upload_as_admin localFile.txt
    

    【讨论】:

    • 这只会解决这个确切的用例。目的是能够执行任意操作,例如列出、删除和构建可组合的快捷方式。
    • 有些事情你不能单独使用变量。请参阅我对威尔回答的评论。
    猜你喜欢
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 2012-09-25
    相关资源
    最近更新 更多