考虑一下这一点。IFS
仅在执行时设置read
。
IFS='' read -r REPLY
Run Code Online (Sandbox Code Playgroud)
但是,如果我对.
(source)执行类似操作,即使在执行该代码行之后,变量也会被分配和更改。
PATH="/new_path:${PATH}" . script.sh
echo "$PATH" # Value changed
Run Code Online (Sandbox Code Playgroud)
为什么会出现这种情况呢?我认为.
和 Bash 一样source
,是一个类似于read
or 的命令echo
。有没有任何文档,例如2.14。特殊的内置实用程序,提到这种行为吗?
如何以符合 POSIX 的方式临时设置$PATH
和.
(源)文件?
我打算将 Gentoo Linux 安装到旧硬件上,该主板同时具有 IDE 和 SATA 硬盘驱动器。我连接了两个 IDE 和一个 SATA 硬盘,并计划对它们进行 RAID。
但是我注意到一个问题:映射到 /dev/sda 的硬盘在每次启动时都会发生变化!
我正在互联网上寻找答案。我发现持久设备名称可能是一个解决方案。但是我担心它会在系统范围内遇到兼容性问题吗?此外,它非常不方便(因为名称很长),除非我可以使用/dev/disk/by-label
. 但它似乎by-label
不能指/dev/sda
和/dev/sdb
- 只有/dev/sda1
可能。而且,对于我使用 BIOS 的旧硬件,我认为我只能使用 MBR ,而不能使用 GPT。MBR环境下如何更改磁盘标签?
另一方面,我认为理想的解决方案是,/dev/sda
在每次启动时都映射到同一个硬盘。想象一下,这可以通过在硬盘上保存一个名为“bootmap”的文件来实现。而“/sda”写在“bootmap”文件中。系统启动时,如果在“bootmap”中找到“/sda”,则驱动器被映射到/dev/sda
. 如果找到“/sdb”,则映射到/dev/sdb
. 等等。(但我知道这可能不是那么理想。)
那么,如何避免/dev/sda
从引导到引导的变化映射?
作为替代方案,编辑标签的方式也不错。- 鉴于它不会在任何地方遇到兼容性问题。
(PS - 无论哪种方式,互联网上还没有解决方案。)
这个问题重点关注 POSIX 兼容的 shell 脚本。
通常通过以下方式递增变量:
i=3
: $(( i += 1 ))
echo "return code = $?" # return code = 0
echo "i = $i" # i = 4
Run Code Online (Sandbox Code Playgroud)
该命令是否$(( i += 1 ))
称为“副作用” :
?
(我在某处读到:
等于true
。我尝试用 or 替换:
,true
它false
有效。如果用 替换false
,则返回码为 1,正如预期的那样。)
为什么成功增加了值$i
,但赋值却不起作用,出现“副作用”?
a='four'
: a='five'
echo "return code = $?" # return code = 0
echo "a = $a" # a = …
Run Code Online (Sandbox Code Playgroud) posix ×2
shell-script ×2
block-device ×1
devices ×1
gentoo ×1
hard-disk ×1
path ×1
shell ×1
source ×1
udev ×1