📜  env hashbang (1)

📅  最后修改于: 2023-12-03 15:00:36.463000             🧑  作者: Mango

程序员必知的env hashbang

你是否曾经遇到过这样的问题:你编写了一段脚本,但是你的系统不知道要用哪个解释器来运行它?这时候,环境变量注释(env hashbang)就可以派上用场了。

什么是env hashbang

env hashbang (或者叫 shebang)是一个由井号和惊叹号组成的特殊注释,它位于脚本的第一行。这个注释告诉操作系统这个脚本需要哪个解释器来执行它。

#!/usr/bin/env python3

这个例子中,env hashbang 告诉操作系统使用 python3 来解释这个脚本。注意,在这个例子中,我们使用 env 来寻找 python3。这是因为不同的系统可能将 python3 安装在不同的位置上。

如何使用env hashbang

首先,你需要确定你要使用的解释器的路径。例如,如果你使用 python3,你可以运行以下命令来查找它的路径:

which python3

这个命令会输出 python3 的路径。例如,在我的机器上,它输出的是 /usr/bin/python3

然后,在脚本的第一行,添加 env hashbang:

#!/usr/bin/env python3

这个例子中,env hashbang 告诉操作系统使用 python3 来解释这个脚本。

更好的使用env hashbang

在一些脚本中,需要借助一些命令行工具来修改文件名、行结尾等等。例如,下面的脚本将会把它所在的文件夹下的所有文件的名字从小写修改为大写:

#!/bin/sh
for file in *
do
    mv "$file" "$(echo $file | tr '[:lower:]' '[:upper:]')"
done

这个脚本使用了通配符来循环访问所有的文件。然而,这段代码还存在一个问题,即文件名中包含空格时会出错。要修复这个问题,我们需要将通配符改为 $(find . -type f -name "*.txt") 这样的形式。

因为这个脚本是使用 shell 解释器来运行,我们也可以使用 bash 的更先进的特性。

#!/bin/bash
shopt -s globstar nullglob
for file in **/*.txt
do
    mv "$file" "${file,,}"
done

这个脚本添加了 shopt -s globstar nullglob 命令来开启 ** 这个特殊的通配符,代表任意深度的文件夹。

总结

env hashbang 是一个十分有用的特性。它让我们在脚本中指定使用哪个解释器来执行这个脚本。在不同的系统上,不同的解释器可能被安装在不同的路径上,使用 env hashbang 可以让我们简单地寻找到正确的路径。除此之外,我们还可以使用它来使用一些先进的 shell 特性。