我编写了一个在 bash 中使用的函数来自动挂载一个目录,~/tmp
如果不存在则创建一个目录:
# mkdir & mount auto
mnt() {
dir="$1";
mkdir ~/tmp/$dir;
/usr/bin/sudo mount /dev/$dir ~/tmp/$dir;
cd ~/tmp/$dir;
}
几个问题 ...
dir="$1";
将变量 dir 设置为 mnt 之后的输入
- 是否$1
需要将其封装在其中,并且每行后面""
是否需要有 a ?;
如果没有 ,它会工作吗;
?
/usr/bin/sudo mount /dev/$dir ~/tmp/$dir;
我看了一个 YouTube 视频关于 Bash 中的 $PATH 你需要了解的一切
在脚本中我应该写完整路径......
/usr/bin/sudo
而不是 ...
sudo
这背后的原因是什么?
答案1
该函数的更好版本:
mnt() {
typeset dir # for local scope for the variable.
# assumes ksh88/pdksh/bash/zsh/yash. Replace typeset with
# local for ash-based shells (or pdksh/bash/zsh)
dir=$1 # here it's the only place where you don't need the quotes
# though they wouldn't harm
mkdir -p -- ~/tmp/"$dir" || return
# quotes needed. mkdir -p creates intermediary directories as required
# and more importantly here, doesn't fail if the directory already
# existed.
# We return from the function if mkdir failed (with the exit status
# of mkdir). The -- is for the very unlikely even that your $HOME starts
# with "-". So you may say it's a pedantic usage here. But it's good
# habit to use it when passing an arbitrary (not known in advance)
# argument to a command.
sudo mount "/dev/$dir" ~/tmp/"$dir" || return
# Or use /usr/bin/sudo if there are more than one sudo commands in $PATH
# and you want to use the one in /usr/bin over other ones.
# If you wanted to avoid calling an eventual "sudo" function or alias
# defined earlier in the script or in a shell customisation file,
# you'd use "command sudo" instead.
cd -P -- ~/tmp/"$dir" # another pedantic use of -P for the case where
# your $HOME contains symlinks and ".." components
}
不需要分号。在 shell 提示符下,您可以编写:
cd /some/where
ls
不是
cd /some/where;
ls;
这在脚本中没有什么不同。您可以使用;
将命令分隔在一行上,如下所示:
cd /some/where; ls
不过,那么你宁愿写:
cd /some/where && ls
这并不是ls
无条件地运行,而是只有在cd
成功时才运行。
答案2
问题:
- $1 需要用“”括起来吗
简短的回答是肯定的
是否需要有一个 ;每行之后?如果没有 ; ,它会工作吗?
是
;
命令分隔符,仅当多个命令位于同一行时才需要,例如:echo "Hello, World"; echo
。当命令位于单独的行(如脚本中)时,这是不必要的,但不会破坏任何内容。为什么我应该指定完整路径而不仅仅是命令名称?
当您简单地键入命令名称时,系统会分析您的路径以查找该命令的第一次出现。在不同位置使用多个命令并不罕见,尤其是在存在 GNU 工具和相同命令的其他变体的情况下。如果您没有指定正在使用的命令的完整路径,您的 shell 将决定使用哪一个,但它可能不是您真正想要的。
我有点不同意总是指定完整路径,因为根据我的经验,通常没有必要,我只关心它找到该工具的某个版本。虽然也有例外,但我认为在考虑它们之前你应该更好地理解它们。例如,在我的环境中,我们大多数的 unix 机器并不默认使用 GNU 工具,但是许多工具都安装在机器上,因此如果我需要对其中一台机器使用 GNU 版本的工具,我需要指定该工具的完整路径。
mnt() {
dir="$1"; # Sets the value of dir to your first positional parameter
mkdir ~/tmp/$dir; # Creates your a directory named after the value of $dir in $HOME/tmp/
/usr/bin/sudo mount /dev/$dir ~/tmp/$dir; # Mounts the device in /dev/$dir to your newly created folder (You better hope you set $1 properly)
cd ~/tmp/$dir; # changes to your newly created/mounted directory.
}