【问题标题】:Make linux SPLIT command compatible with Mac OS terminal使 linux SPLIT 命令与 Mac OS 终端兼容
【发布时间】:2018-05-17 19:39:26
【问题描述】:

我有一个在 linux 中运行良好的 bash 脚本,但是当我在我的 Mac 终端上运行它时它失败了,因为 splitcommand 的选项在 Mac 终端中略有不同。我的脚本是:

## Merge and half final two segments
last_file=`ls temp_filt.snplist_* | tail -n 1`
penultimate_file=`ls temp_filt.snplist_* | tail -n 2 | head -1`
cat $penultimate_file $last_file > temp && mv temp $penultimate_file
split -n l/2 $penultimate_file && mv xaa $penultimate_file; mv xab $last_file

脚本在最后一行失败,因为tcsh 中不存在-n l/2(Mac OS 10.x.x 中的默认 shell 环境)。我想知道 tcsh 中的等效脚本是什么。

有没有一种通用的方法可以在 Mac OS 终端中运行 linux 脚本,而无需更改脚本?

【问题讨论】:

  • tcsh 十多年来一直没有成为 Mac OS 中的默认 shell(尽管它可能是您的默认 shell)。
  • @chepner:嗨,这里说的是什么? stackoverflow.com/a/8051196/5224239
  • 正确;如果帐户在多个操作系统更新中持续存在,您可能仍将 tcsh 作为您的登录 shell,但我建议切换到 bash(或至少与 POSIX 兼容)。

标签: linux bash macos


【解决方案1】:

执行split 的不是 MacOS 终端。这是一个名为split 的程序。 MacOS 建立在 FreeBSD 用户空间工具之上,其行为与 GNU 工具不同。

有两种选择:

  • 在您的 Linux 机器上安装 FreeBSD 工具以使其与 FreeBSD 兼容。

  • 在您的 MacOS 机器上安装 GNU 实用程序。如果你有brew,你可以使用brew install coreutils

【讨论】:

  • coreutils 不会替换 MacOS 上的 FreeBSD 工具,它会添加一个 'g' 前缀。例如。 gsplit 如果您需要以正常名称使用这些命令,您可以从 bashrc 中将“gnubin”目录添加到 PATH,例如:PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
【解决方案2】:

一种选择是使用内置语言并限制外部命令

注意脚本包含几个缺陷:ls 无用,解析ls 输出不安全

array=(temp_filt.snplist_*)
last_file=${array[ -1]}
penultimate_file=${array[ -2]}

如果文件很大,bash 内置读取会很慢。

在这种情况下使用catwcheadtail 的简单解决方案在系统之间是兼容的。注意当传入命令时,变量必须用双引号引起来避免分词。

cat "$penultimate_file" "$last_file" > temp || exit 1
nb_lines=$(wc -l < temp)
((half_nb_lines=nb_lines/2))
head "-$half_nb_lines" temp > "$penultimate_file" || exit 1
tail "+$((half_nb_lines+1))" temp > "$last_file" || exit 1
rm temp

注意最后一行

command1 && command2 ; command3

无论第一个退出状态如何,都会执行 command3,{ ; } 可用于对命令进行分组

command1 && { command2 ; command3; }

【讨论】:

  • 非常感谢您的建议,真的很有帮助!
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 2014-06-08
  • 2018-08-15
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
相关资源
最近更新 更多