2017-12-04 7 views
0

Linuxでうまく動作するbashスクリプトがありますが、Mac端末で実行すると失敗します。splitコマンドのオプションはMac端末で少し異なります。私のスクリプトは次のとおりです。linux SPLITコマンドをMac OS端末と互換性を持たせる

## 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する(Mac OS 10.x.xのデフォルトのSHEL環境)に存在しないため、スクリプトは、最後の行で失敗します。私はtcshに相当するスクリプトが何か不思議でした。

Mac OS端末でLinuxスクリプトを実行する一般的な方法はありますか?スクリプトを変更する必要はありませんか?

+0

'tcsh'はMac OSの*デフォルトシェルではありません。 – chepner

+0

@chepner:こんにちは、それはここに何を言いますか? https://stackoverflow.com/a/8051196/5224239 –

+0

修正;アカウントが複数のOSアップデートにまたがっている場合は、まだログインシェルとして 'tcsh'を持っているかもしれませんが、' bash'(または少なくともPOSIX互換のもの)に切り替えることをお勧めします。 – chepner

答えて

1

でこれを行うことができます安全ではありません

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

ファイルが大きい場合は、bash読み取りの組み込みが非常に遅くなります。

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; } 
+0

本当に助けていただきありがとうございます。 –

2

splitを実行しているMacOS端末ではありません。それはsplitと呼ばれるプログラムです。 MacOSは、FreeBSDユーザランドツール上に構築されています。これは、GNUユーティリティとは異なる動作をします。

  • は、FreeBSDと互換性を持たせるための、あなたのLinuxボックス上のFreeBSDのツールをインストールします。

    は、2つのオプションがあります。

  • MacOSマシンにGNU utilsをインストールします。 lsは無用であるとls出力を解析することである:あなたがbrewを持っている場合は、オプションは、言語ビルトインを使用して外部コマンドに

    注スクリプトは、いくつかの欠陥が含まれているを制限することですbrew install coreutils

関連する問題