declare和less
declare -x LESSCLOSE="/usr/bin/lesspipe %s %s"
declare -x LESSOPEN="| /usr/bin/lesspipe %s"
`declare` 是一个在 **Unix/Linux Shell**(如 Bash)中用于声明变量及其属性的命令。它通常用于设置变量的值、类型以及一些特殊属性,例如是否将变量导出为环境变量。以下是对 `declare` 的详细解释和常见用法:
### **1. 基本语法**
`declare` 的基本语法如下:
```bash
declare [选项] [变量名]=[值]
```
### **2. 常见选项**
- **`-x`**:将变量导出为环境变量。环境变量可以在子进程中使用。
- **`-i`**:将变量声明为整数类型。
- **`-r`**:将变量声明为只读变量,无法修改。
- **`-a`**:将变量声明为数组。
- **`-p`**:打印变量的声明信息。
- **`-f`**:仅显示函数定义。
### **3. 示例**
#### **3.1 设置普通变量**
```bash
declare var="Hello, World!"
echo $var
# 输出: Hello, World!
```
#### **3.2 设置环境变量**
```bash
declare -x MY_VAR="This is an environment variable"
echo $MY_VAR
# 输出: This is an environment variable
```
在子进程中也可以访问 `MY_VAR`:
```bash
bash -c 'echo $MY_VAR'
# 输出: This is an environment variable
```
#### **3.3 设置整数变量**
```bash
declare -i num=10
echo $num
# 输出: 10
num=num+5
echo $num
# 输出: 15
```
#### **3.4 设置只读变量**
```bash
declare -r readonly_var="Cannot change"
# readonly_var="Try to change" # 这将导致错误
```
#### **3.5 设置数组**
```bash
declare -a my_array=("item1" "item2" "item3")
echo ${my_array[1]}
# 输出: item2
```
#### **3.6 打印变量声明信息**
```bash
declare -x MY_VAR="This is an environment variable"
declare -p MY_VAR
# 输出: declare -x MY_VAR="This is an environment variable"
```
### **4. 在脚本中的使用**
`declare` 常用于脚本中,以确保变量的类型和属性符合预期。例如,在一个脚本中,你可能希望某些变量是只读的,或者某些变量需要导出为环境变量供子进程使用。
### **5. 注意事项**
- `declare` 是 Bash 内置命令,不是所有 Shell 都支持。如果你在其他 Shell(如 `sh` 或 `dash`)中使用,可能会导致错误。
- 如果没有指定选项,`declare` 默认声明普通变量。
- 使用 `declare -p` 可以查看变量的当前声明状态,这对于调试非常有用。
### **6. 与 `export` 的区别**
`export` 命令也可以将变量导出为环境变量,但它没有 `declare` 那么多的选项。`declare -x` 是 `export` 的更通用形式,可以同时设置变量的值和导出为环境变量。
### **7. 总结**
`declare` 是一个强大的 Shell 内置命令,用于声明和管理变量的属性。通过使用 `declare`,你可以更精确地控制变量的行为,例如将其导出为环境变量、设置为只读或整数类型等。这在编写复杂的 Shell 脚本时非常有用。
这两个 `declare -x` 命令是用于设置环境变量的,具体来说,它们配置了 `less` 命令的行为。`less` 是一个常用的分页查看文件内容的工具。这两个变量(`LESSOPEN` 和 `LESSCLOSE`)用于扩展 `less` 的功能,使其能够更好地处理某些特殊文件类型(如压缩文件、二进制文件等)。以下是对这两个变量的详细解释:
### **1. `LESSOPEN`**
`LESSOPEN` 是一个环境变量,用于指定在打开文件之前要运行的过滤器(filter)。这个过滤器可以对文件内容进行预处理,以便 `less` 能够正确显示文件内容。
#### **格式**
```bash
declare -x LESSOPEN="| /usr/bin/lesspipe %s"
```
#### **解释**
- `|`:表示将文件内容通过管道(pipe)传递给过滤器程序。
- `/usr/bin/lesspipe`:这是一个过滤器程序,通常用于处理特殊文件类型(如压缩文件、二进制文件等)。
- `%s`:是一个占位符,表示当前要查看的文件名。
#### **作用**
当运行 `less` 命令时,`LESSOPEN` 会将文件名传递给 `/usr/bin/lesspipe`,`lesspipe` 会根据文件类型对文件内容进行预处理,然后将处理后的结果传递给 `less`。这样,`less` 就可以正确显示文件内容,即使文件是压缩的或二进制格式的。
### **2. `LESSCLOSE`**
`LESSCLOSE` 是一个环境变量,用于指定在关闭文件时要运行的清理命令。这个命令通常用于清理 `LESSOPEN` 所做的工作,例如删除临时文件。
#### **格式**
```bash
declare -x LESSCLOSE="/usr/bin/lesspipe %s %s"
```
#### **解释**
- `/usr/bin/lesspipe`:与 `LESSOPEN` 中的过滤器程序相同。
- `%s %s`:两个占位符,分别表示当前文件名和临时文件名。
#### **作用**
当 `less` 命令结束时,`LESSCLOSE` 会调用 `/usr/bin/lesspipe`,并传递当前文件名和临时文件名。`lesspipe` 会根据这些信息进行清理工作,例如删除临时文件,以确保系统资源被正确释放。
### **3. 总结**
这两个变量的作用是:
- **`LESSOPEN`**:在打开文件时,通过 `/usr/bin/lesspipe` 对文件内容进行预处理,以便 `less` 能够正确显示文件内容。
- **`LESSCLOSE`**:在关闭文件时,通过 `/usr/bin/lesspipe` 进行清理工作,例如删除临时文件。
### **4. 示例**
假设你有一个压缩文件 `example.gz`,你希望用 `less` 查看其内容:
```bash
less example.gz
```
如果没有设置 `LESSOPEN` 和 `LESSCLOSE`,`less` 可能无法正确显示压缩文件的内容。但通过设置这两个变量,`less` 会调用 `/usr/bin/lesspipe` 来解压文件内容,然后显示解压后的内容。
### **5. 注意事项**
- `/usr/bin/lesspipe` 是一个常见的过滤器程序,但不同的系统可能有不同的实现。如果你的系统中没有这个程序,可以尝试安装它(例如在 Ubuntu 上运行 `sudo apt-get install lesspipe`)。
- 如果你不想使用这些功能,可以将 `LESSOPEN` 和 `LESSCLOSE` 设置为空:
```bash
export LESSOPEN=""
export LESSCLOSE=""
```
通过合理配置这些变量,可以显著提升 `less` 的功能和灵活性。