我有一个bash脚本在linux上工作正常,但是当我在我的Mac终端上运行它时会失败,因为split
命令的选项在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
脚本在最后一行失败,因为-n l/2
并不存在于tcsh
中(Mac OS 10.x.x中的默认shel环境)。我想知道tcsh中的等效脚本是什么。
是否有通用的方法在Mac OS终端中运行linux脚本,而无需更改脚本?
答案 0 :(得分:5)
不是MacOS终端正在进行split
。这是一个名为split
的程序。 MacOS基于FreeBSD用户态工具,其行为与GNU工具不同。
有两种选择:
在Linux机器上安装FreeBSD工具,使它们与FreeBSD兼容。
在MacOS计算机上安装GNU utils。如果您有brew
,则可以使用brew install coreutils
答案 1 :(得分:1)
选项是使用语言内置函数并限制外部命令
注意脚本包含几个缺陷:ls
没用,解析ls
输出不安全
array=(temp_filt.snplist_*)
last_file=${array[ -1]}
penultimate_file=${array[ -2]}
如果文件很大,那么内置读取的速度会非常慢。
在这种情况下使用cat
,wc
,head
和tail
在系统之间兼容的简单解决方案。注意在命令中传入时必须使用双引号来避免单词分割。
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; }