如果我输入echo hello
,我的终端将如下所示:
My-Computer:~ user$ echo hello
hello
My-Computer:~ user$
但如果我有这样的功能
stringen () { cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-Z-A-z-0-9' | head -c "$1" ; }
看起来像这样
My-Computer:~ user$ stringen 18
^\k6JPWVIUdEiudcWSMy-Computer:~ user$
看到它没有在新行中打印吗?使用printf
vs时同样如此echo
。我怎样才能让我的函数创建这样的新行?我以为他们;
会解决这个问题,但显然不会。
例如,这返回我想要的
variable=$(stringen 18)
echo $variable
是有回声的东西吗?
答案1
, cat
,tr
或都不head
添加换行符(urandom
可以,但它是随机的,所以我不相信它)。您必须手动插入新行,并printf '\n'
在函数末尾添加 a 或echo
.
顺便说一句,有些 shell 确实添加了它,例如zsh
,以防止此类情况。
答案2
你的函数是否打印换行符一点也不重要。命令替换如果有的话将删除它们。
Bash 通过执行命令并将命令替换替换为命令的标准输出来执行扩展,删除所有尾随换行符。 (强调我的)
testfunc() { echo hello; } # a newline is printed
output=$(testfunc) # $output does NOT contain a trailing newline
echo "$output" # echo adds a newline
printf "%s" "$output" # no newline
答案3
恕我直言,这可能部分地但echo
问题的另一部分是影响力。因此,理想的情况是如果您的发行版最近发布了GNU版本tr
(就像我的),因为正如你在下面看到的,你的语法中有一个明显的怪癖,GNUtr
抱怨告诉你必须在哪里应用“修复”。
原来的:
$ stringen() { cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-Z-A-z-0-9' | head -c "$1" ; }
$ stringen 18
tr: range-endpoints of 'a-Z' are in reverse collating sequence order
哎哟!这是您的线路的替代版本,它修复了它(至少在我的GNU 发行版tr
就成功了):
“固定的”:
$ stringen () { cat /dev/urandom | env LC_CTYPE=C tr -cd 'A-Za-z0-9' | head -c "$1" ; }
$ stringen 18
V068BrYGKIICyLI4QB
$
结论:最好不要将集合与 混合使用tr
,但是在组合集合/范围时,始终确保保持大字母对大字母,小字母对小字母。
然而:对于非 GNU tr
,缺少换行符的问题可能仍然存在。但对于 GNU 来说,我修正后的行将不再需要任何花哨的换行技巧。
答案4
您不需要变量来保存此输出。直接简单的echo
输出:
echo "$(stringen 18)"