【问题标题】:print environment variables sorted by name including variables with newlines打印按名称排序的环境变量,包括带有换行符的变量
【发布时间】:2020-03-19 11:13:18
【问题描述】:

我找不到这个特定案例的现有答案:我想简单地显示所有导出的环境变量,按它们的名称排序。通常我可以这样做:

$ env | sort

但是,如果某些环境变量的值中包含换行符(就像我正在使用的 CI 系统上的情况一样),这将不起作用,因为多行值会与其他变量混淆。

【问题讨论】:

  • 使用 bash,您可能可以这样做:env -0 | while IFS= read -r -d ''; do printf '%s\n' "$REPLY"; done
  • 那不会对它们进行排序。
  • 是的,不幸的是它没有排序。

标签: bash environment-variables


【解决方案1】:

回答我自己的问题,因为我在其他地方找不到这个:

$ env -0 | sort -z | tr '\0' '\n'

env -0 用空字符分隔每个变量(这或多或少是它们在内部存储的方式)。 sort -z 使用空字符代替换行符作为待排序字段的分隔符,最后tr '\0' '\n' 再次将空字符替换为换行符。

注意:env -0sort -z 是这些实用程序的 GNU coreutils 版本提供的非标准扩展。对如何使用 POSIX sort 执行此操作的其他想法持开放态度——我确信这是可能的,但它可能需要一个 for 循环或其他东西;不像单线那么容易。

【讨论】:

  • 我的排序没有-z选项,怎么办?
  • 请记住-z 选项是envsort 的非标准扩展;特别是 BSD 实现不支持它。
  • 在busybox(Alpine Linux)中不起作用。
【解决方案2】:

bash 内置 export 打印一个排序的 envars 列表:

export -p | sed 's/declare -x //'

类似地,打印导出函数的排序列表(不包括它们的定义):

export -f | grep 'declare -fx' | sed 's/declare -fx //' 

【讨论】:

  • 干得好。也许更改 sed 模式以包含行 char sed 's/^export //g 的开头并进行全局替换
【解决方案3】:
env | sort -f

为我工作。

-f 选项使排序忽略大小写,这可能是您 99% 的时间想要的

【讨论】:

  • 这里的问题是关于在某些变量包含多行值的情况下对环境变量进行排序,在这种情况下,sort 单独无法处理它,因为它将像其他任何行一样对这些行进行排序。
猜你喜欢
  • 2015-05-28
  • 1970-01-01
  • 2011-06-06
  • 2019-10-31
  • 2017-11-25
  • 1970-01-01
  • 2010-09-23
  • 2015-08-04
  • 2021-02-16
相关资源
最近更新 更多