如何让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循环,这仍然不起作用,所以我认为这不是问题所在。
1条答案
按热度按时间a8jjtwal1#
正如@GordonDavisson在注解中提到的,问题不在于
mount_smbfs
,而在于当命令被赋值给字符串变量时如何解析,最好的解决方案是不这样做,如下所示:对于如何使用字符串变量作为实际的命令调用,有一些建议,但我选择不这样做。做这样的最小改变是有效的:
将完整的命令赋给字符串只是为了在调用命令之前方便地将命令回显到控制台,以便进行日志记录和调试。您仍然可以这样做,但它不会与命令本身紧密关联。这在命令字符串变量只在调用实际命令之前使用一次的上下文中不是真实的的问题。如果你真的想使用字符串变量作为你的实际命令调用,那么在链接的帖子中有一些关于如何绕过这个问题的建议。
同样正如评论和链接中提到的,最好将命令 Package 在函数中。我倾向于不同意这种情况,因为它是一个单行命令,本质上就是函数调用本身。我除了调用它之外什么都不做,没有额外的验证或任何事情。 Package 它只是增加了一个不必要的卷积层。然而,我还没有找到一个完整的解释,为什么它可能仍然是最佳实践。
也就是说,我将把完整的脚本(减去导出)重新 Package 成一组函数,就像我在这里进行故障排除和发布之前所做的那样。