linux - 为什么使用换行符作为 IFS 时会有额外的输出?

标签 linux bash

我正在使用下面的代码测试不同 IFS 值的输出。

#!/bin/bash

IFS=$'\n'

export $IFS

for i in $(ls -la);
do
  echo $i;
done

但是对于像 IFS 这样的换行符,以下内容也会在预期输出之前打印出来。为什么会显示这个输出?

declare -x DBUS_SESSION_BUS_ADDRESS="unix:abstract=/tmp/dbus-xwjTMGqSe7,guid=b8543bd3ba7dbc5ca284b0ce5741ccff"
declare -x DESKTOP_SESSION="default"
declare -x DISPLAY=":0"
declare -x GDMSESSION="default"
declare -x GDM_LANG="en_US.utf8"
declare -x GIO_LAUNCHED_DESKTOP_FILE="/usr/share/applications/atom.desktop"
declare -x GIO_LAUNCHED_DESKTOP_FILE_PID="19896"
declare -x GJS_DEBUG_OUTPUT="stderr"
declare -x GJS_DEBUG_TOPICS="JS ERROR;JS LOG"
declare -x GNOME_DESKTOP_SESSION_ID="this-is-deprecated"
declare -x GPG_AGENT_INFO="/run/user/1000/keyring/gpg:0:1"
declare -x LANG="en_US.utf8"
declare -x NODE_ENV="production"
declare -x NODE_PATH="/usr/share/atom/resources/app.asar/exports"
declare -x OLDPWD
declare -x PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_AGENT_PID="2218"
declare -x SSH_AUTH_SOCK="/run/user/1000/keyring/ssh"
declare -x WINDOWPATH="7"
declare -x XDG_CURRENT_DESKTOP="GNOME"
declare -x XDG_DATA_DIRS="/usr/share/gnome:/usr/local/share/:/usr/share/"
declare -x XDG_MENU_PREFIX="gnome-"
declare -x XDG_RUNTIME_DIR="/run/user/1000"
declare -x XDG_SEAT="seat0"
declare -x XDG_SESSION_DESKTOP="default"
declare -x XDG_SESSION_ID="1"
declare -x XDG_VTNR="7"

最佳答案

因为 export 命令中的美元符号。

由于您的分配,$IFS 将扩展为一个换行符,如果没有引号,它将被 shell 简单地删除,留下 export 命令没有参数。

根据help export:

export: export [-nf] [name[=value] ...] or export -p
  [...]
  If no NAMEs are given, or if `-p' is given, a list of
  all names that are exported in this shell is printed.
  [...]

这正是发生的事情。

要解决这个问题,只需完全关闭 export 命令,因为在这种情况下不需要它(谢谢,kojiro)。

关于linux - 为什么使用换行符作为 IFS 时会有额外的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37378961/

相关文章:

linux - 如何用逗号而不是空格分割列表

bash - Docker exec 引用变量

linux - 堆是否分配在内存页上?

java - 为什么我从 JComboBox 得到非常不同的行为,这取决于平台 (Windows/Linux) 和语言 (Java/Jython)

linux - 从 Windows 调用基于 LINUX 的二进制文件并返回输出

mysql - 在 Vagrant 中从命令行更改 mysql 绑定(bind)地址

regex - 如果找到相同的单词,命令 egrep 提取一行

linux - 最常用IP地址bash脚本的Apache访问日志

linux - alpine linux -- autossh(缺失)

java - 尝试启动 greenfoot 时的核心转储