参数以奇怪的方式组合

时间:2018-08-27 19:03:10

标签: bash

我正在尝试从bash函数内部安装smb共享。在提示下可以进行以下操作:

mount_smbfs "//domain;user@foo.domain.com/share" ~/mnt/share

在我的函数中,我将其编写为:

mount_smbfs "//domain\;user@$2" $HOME/mnt/$1

我还没有开始工作。它只是输出mount命令的用法。因此,我在函数的开头添加了一个set -x,然后可以看到命令执行如下:

'mount_smbfs //domain\;user@foo.domain.com/share' /Users/user/mnt/share

因此,好像没有传递mount_smbfs的第二个参数。谁能告诉我为什么?

更新

这是我的职能:

mnt-prod() {
    set -x
    umount $HOME/mnt/$1
    mkdir -p $HOME/mnt/$1
    mount_smbfs "//domain\;user@$2" $HOME/mnt/$1
    cd $HOME/mnt/$1
}

这是我要使用的别名:

alias mnt-share="mnt-prod share foo.domain.com/share;"

解决方案

最后我对@ sjnarv的好答案做了一个稍微修改的版本:

mnt-prod() {
    local dir="$1" host="$2" share="$3"

    umount "$HOME/mnt/$dir" || true
    mkdir -p "$HOME/mnt/$dir" && \
        mount_smbfs "//production;tas@$host/$share" "$HOME/mnt/$dir" && \
        cd "$HOME/mnt/$dir"
}

1 个答案:

答案 0 :(得分:1)

@chepner的上述第一条评论似乎仍然最相关。如果我把\字符放在前面;我看到类似这样的错误:

mount_smbfs: URL parsing failed, please correct the URL and try again: Invalid argument

更长的答案

使用mount_smbfs似乎意味着使用MacOS(与各种Linux发行版上的mount.cifs类似)。我在这里的评论反映了在Mac上进行尝试的情况。

mount_smbfs的用法消息/手册页:

mount_smbfs [-N] [-o options] [-d mode] [-f mode] [-h] [-s] [-v]
            //[domain;][user[:password]@]server[/share] path

您的函数为domainuserservershare提供值,并使用围绕{{1}的局部约定构造path }值。

我的网络环境具有自己的特定于位置的详细信息,因此,我没有将我的本地性强加到share中,而是更新了该函数以使用更多的参数来构造最终的mnt-prod命令以更通用的方式IMO使得它更加灵活,并且易于阅读和维护。

请考虑以下内容:

  • 使用局部变量跟踪/记录函数args 1到4
  • 更一致地用引号引起来(也许您最终会有一个带有空格的共享名)
  • 在存在mount_smbfs选项(|| true)的情况下,使用umount惯用法让errexit命令良性地失败
  • 使用set -e创建一个&&命令列表,该命令列表在第一次命令失败时中止

建议的更新:

mkdir && mount_smbfs && cd

如果我的本地Mac用户名是mnt-prod() { local domain="$1" user="$2" host="$3" share="$4" set -x umount "$HOME/mnt/$share" || true mkdir -p "$HOME/mnt/$share" && \ mount_smbfs "//$domain;$user@$host/$share" "$HOME/mnt/$share" && \ cd "$HOME/mnt/$share" set +x } ,我的域名是jdoe,我的Samba / SMB / CIFS服务器是MYDOMAIN,我的用户名my.domain.net,并共享名称guest,用法如下:

public

...并且安装成功:本地路径/ Users / jdoe / mnt / public提供对远程共享$ mnt-prod MYDOMAIN guest my.domain.net public + umount /Users/jdoe/mnt/public umount: /Users/jdoe/mnt/public: not currently mounted + true + mkdir -p /Users/jdoe/mnt/public + mount_smbfs '//MYDOMAIN;guest@my.domain.net/public' /Users/jdoe/mnt/public + cd /Users/jdoe/mnt/public + set +x $ 的访问。