Solaris 10 bash中tail命令引用行数变量报错如何解决
问题根源
这不是bash变量引用的问题,$LINE、${LINE}两种变量展开写法本身完全正确。故障来自Solaris 10默认的/usr/bin/tail是legacy System V版本,参数解析逻辑和你之前在ksh环境下调用的tail版本存在差异:
- 该版本tail对
-<数字>的简写传参方式兼容性不稳定,在bash环境下经常无法正确识别该参数为行数配置,会跳过后续的文件路径参数,直接抛出"cannot open input"错误。 - 多数情况下ksh环境默认会优先加载
/usr/xpg4/bin下的POSIX标准兼容工具,而bash环境默认PATH优先级下会先调用legacy版的/usr/bin/tail,两边调用的tail根本不是同一个二进制文件,才会出现同写法在ksh正常、bash报错的现象。
可行解决方法
- 优先使用POSIX标准的
-n参数显式指定行数,这是全版本通用的无兼容问题写法:
LINE=8 tail -n "$LINE" <目标文件路径>
变量外加双引号是标准写法,可规避变量值夹带空格、不可见字符时的解析异常。
- 如果要保留
-<数字>的简写习惯,直接调用XPG4兼容版tail即可,行为和你之前ksh环境下的表现完全一致:
LINE=8 /usr/xpg4/bin/tail -$LINE <目标文件路径>
如果脚本里大量用到这类XPG标准工具,可以在脚本开头调整PATH优先级,一劳永逸解决兼容问题:
export PATH=/usr/xpg4/bin:$PATH
- 如果上述写法仍报错,检查LINE变量是否夹带不可见字符:如果变量值是从外部文件读取、或是跨系统拷贝的脚本,很可能带有Windows格式的回车符
\r,导致参数被污染,定义变量后加一行过滤即可:
LINE=$(echo "$LINE" | tr -d '\r')
内容的提问来源于stack exchange,提问作者jim witte
相关产品推荐
相关产品推荐

