linux 没有这样的文件或目录:mount_smbfs {装载点} {本地目录}

cbwuti44  于 2022-12-22  发布在  Linux
关注(0)|答案(1)|浏览(95)

如何让mount_smbfs在一个循环中在Mac zsh终端上工作?
这些相同的命令在逐个运行时可以正常工作,但在循环中发出时会抛出错误:no such file or directory: mount_smbfs {mount point} {local directory}.
所以,当我源代码这样的东西(导出命令实际上存在于它们自己的脚本中,首先获得源代码):

export H_DIR="/mnt/${USER}"
export I_DIR="/mnt/I"
export DUM_HOST="dummy.host.ninja"

declare -A mounts
mounts[${H_DIR}]="//${USER}@${DUM_HOST}/${USER}"
mounts[${I_DIR}]="//${DUM_HOST}/I"
 
for dir mount_point in ${(kv)mounts}; do
 if [ ! -d $dir ]; then
  echo "Making $dir and intermediates."
  mkdir -p $dir
 #else
  #command="diskutil unmount $dir"  
  #echo "command: $command"
  #$command
 fi
 
 command="mount_smbfs $mount_point $dir"
 echo "command: $command"
 $command

 ls -alt $dir
done

我得到了这样的结果:

command: mount_smbfs //me@dummy.host.ninja/me /mnt/me
/Users/me/.zsh_setup/mount_all.zsh:24: no such file or directory: mount_smbfs ///me@dummy.host.ninja/me /mnt/me
total 0
drwxr-xr-x  3 me  staff  96 Dec 20 14:30 ..
drwxr-xr-x  2 me  staff  64 Dec 20 14:30 .
command: mount_smbfs //dummy.host.ninja/I /mnt/I
/Users/me/.zsh_setup/mount_all.zsh:24: no such file or directory: mount_smbfs ///dummy.host.ninja/I /mnt/I
total 0
drwxr-xr-x  3 me  staff  96 Dec 20 14:30 ..
drwxr-xr-x  2 me  staff  64 Dec 20 14:30 .

但是,我可以粘贴在循环中运行的相同命令,它就能工作了。

me@my_mac ~ % mount_smbfs //me@dummy.host.ninja/me /mnt/me
Password for dummy.host.ninja: 
me@my_mac ~ %
me@my_mac ~ % ls -alt /mnt/me
total 1499808
drwxr-xr-x  3 me  staff         96 Dec 20 14:30 ..
drwx------  1 me  staff      16384 Dec 20 14:02 .
-rwx------  1 me  staff      10621 Dec 20 14:02 .bash_history
... A bunch more folders that live on the mounted host ...
me@my_mac ~ % 
me@my_mac ~ % 
me@my_mac ~ % mount_smbfs //dummy.host.ninja/I /mnt/I
me@my_mac ~ %   
me@my_mac ~ % ls -alt /mnt/I
total 960
drwx------  1 me  staff  16384 Dec 20 18:33 .snapshot
drwxr-xr-x  7 me  staff    224 Dec 20 14:30 ..
drwx------  1 me  staff  16384 Sep 21 11:22 .
... A bunch more folders that live on the mounted host ...
me@my_mac~ %

上下文:

me@my_mac ~ % ls -l /
total 9
drwxrwxr-x  21 root  admin   672 Dec 17 11:03 Applications
drwxr-xr-x  67 root  wheel  2144 Dec 16 10:03 Library
drwxr-xr-x@  9 root  wheel   288 Oct 12 23:06 System
drwxr-xr-x   6 root  admin   192 Dec 16 09:45 Users
drwxr-xr-x   3 root  wheel    96 Dec 20 12:38 Volumes
drwxr-xr-x@ 38 root  wheel  1216 Oct 12 23:06 bin
drwxr-xr-x   2 root  wheel    64 Oct 12 23:06 cores
dr-xr-xr-x   3 root  wheel  4507 Dec 20 12:38 dev
lrwxr-xr-x@  1 root  wheel    11 Oct 12 23:06 etc -> private/etc
lrwxr-xr-x   1 root  wheel    25 Dec 20 12:38 home -> /System/Volumes/Data/home
lrwxr-xr-x   1 root  wheel    26 Dec 20 12:38 mnt -> Users/me/mounts
... and so on ...
me@my_mac ~ % 
me@my_mac ~ % ls -l /Users/me/mounts
total 32
drwx------  1 me  staff  16384 Sep 21 11:22 I
drwxr-xr-x  3 me  staff     96 Dec 20 14:30 me
me@my_mac ~ %

我需要在第一次挂载时输入一次密码,但因为我使用ssh密钥,所以不需要再次输入密码。如果我手动挂载一个来打开ssh密钥,然后在其他位置运行for循环,这仍然不起作用,所以我认为这不是问题所在。

a8jjtwal

a8jjtwal1#

正如@GordonDavisson在注解中提到的,问题不在于mount_smbfs,而在于当命令被赋值给字符串变量时如何解析,最好的解决方案是不这样做,如下所示:对于如何使用字符串变量作为实际的命令调用,有一些建议,但我选择不这样做。
做这样的最小改变是有效的:

command="mount_smbfs $mount_point $dir"
echo "command: $command"
# Replace ...
# $command
# ... with the actual command:
mount_smbfs $mount_point $dir

将完整的命令赋给字符串只是为了在调用命令之前方便地将命令回显到控制台,以便进行日志记录和调试。您仍然可以这样做,但它不会与命令本身紧密关联。这在命令字符串变量只在调用实际命令之前使用一次的上下文中不是真实的的问题。如果你真的想使用字符串变量作为你的实际命令调用,那么在链接的帖子中有一些关于如何绕过这个问题的建议。
同样正如评论和链接中提到的,最好将命令 Package 在函数中。我倾向于不同意这种情况,因为它是一个单行命令,本质上就是函数调用本身。我除了调用它之外什么都不做,没有额外的验证或任何事情。 Package 它只是增加了一个不必要的卷积层。然而,我还没有找到一个完整的解释,为什么它可能仍然是最佳实践。
也就是说,我将把完整的脚本(减去导出)重新 Package 成一组函数,就像我在这里进行故障排除和发布之前所做的那样。

相关问题