Děkuji @jdt za vaši odpověď.
Poté, a protože mám stále tento problém s návratem vozíku, napsal jsem ten malý skript. Spusťte pouze carriage_return
a budete vyzváni, abyste soubor "vyčistili".
https://gist.github.com/kartonnade/44e9842ed15cf21a3700
alias carriage_return=remove_carriage_return
remove_carriage_return(){
# cygwin throws error like :
# syntax error near unexpected token `$'{\r''
# due to carriage return
# this function runs the following
# cat originalfile | tr -d "\r" > newfile
read -p "File to clean ? "
file_to_clean=$REPLY
temp_file_to_clean=$file_to_clean'_'
# file to clean => temporary clean file
remove_carriage_return_one='cat '$file_to_clean' | tr -d "\r" > '
remove_carriage_return_one=$remove_carriage_return_one$temp_file_to_clean
# temporary clean file => new clean file
remove_carriage_return_two='cat '$temp_file_to_clean' | tr -d "\r" > '
remove_carriage_return_two=$remove_carriage_return_two$file_to_clean
eval $remove_carriage_return_one
eval $remove_carriage_return_two
# remove temporary clean file
eval 'rm '$temp_file_to_clean
}
Může se jednat o problém s kódováním souboru.
Při práci na souborech mezi různými operačními systémy a editory jsem narazil na problémy s kódováním typů souborů – v mém případě zejména mezi systémy Linux a Windows.
Doporučuji zkontrolovat kódování vašeho souboru, abyste se ujistili, že je vhodný pro cílové linuxové prostředí. Myslím, že problém s kódováním je méně pravděpodobný vzhledem k tomu, že používáte MAC, než kdybyste použili textový editor Windows, nicméně si myslím, že kódování souborů stále stojí za zvážení.
--- UPRAVIT (Přidejte skutečné řešení podle doporučení @Potatoswatter)
Abych demonstroval, jak by mohl být problém s kódováním typu souboru, zkopíroval jsem/vložil jsem váš vzorový skript do programu Poznámkový blok ve Windows (nemám přístup k počítači Mac), poté jsem jej zkopíroval do počítače s linuxem a spustil:
[email protected]:~/windows> sh ./originalfile
./originalfile: line 2: syntax error near unexpected token `$'{\r''
'/originalfile: line 2: `test() {
V tomto případě Poznámkový blok uložil soubor s návraty vozíku a odřádkováním, což způsobilo výše uvedenou chybu. \r
označuje návrat vozíku (systémy Linux ukončují řádky odřádkováním \n
pouze).
Na linuxovém počítači můžete tuto teorii otestovat spuštěním následujícího příkazu k odstranění návratů vozíku ze souboru, pokud jsou přítomny:
cat originalfile | tr -d "\r" > newfile
Potom zkuste spustit nový soubor sh ./newfile
. Pokud to funguje, problém byl návrat vozíku jako skryté znaky.
Poznámka: Toto není přesná replikace vašeho prostředí (nemám přístup k Macu), ale zdá se mi pravděpodobné, že problém je v tom, že se editor někde vrátí do souboru.
--- /UPRAVIT
Abychom to trochu upřesnili, operační systémy a editory mohou mít různé výchozí hodnoty kódování souborů. Aplikace a editory obvykle ovlivní použité kódování typu souboru, například si myslím, že Microsoft Notepad a Notepad++ jsou výchozí Windows-1252. Mohou také existovat rozdíly v novém řádku, které je třeba vzít v úvahu (V prostředí Windows se k ukončení řádků v souborech často používá návrat vozíku a odřádkování, zatímco v Linuxu a OSX se obvykle používá pouze odřádkování).
Podobná otázka a odpověď, která odkazuje na kódování souboru, je zde:při provádění bash skriptu se zobrazuje špatný znak
zkuste něco jako
$ sudo apt-get install dos2unix
$ dos2unix offendingfile
Snadný způsob, jak převést example.sh
soubor na UNIX
pokud pracujete ve Windows, je třeba použít NotePad++ (Edit>EOL Conversion>UNIX/OSX Format)
Můžete také nastavit výchozí EOL v notepad++ (Nastavení>Předvolby>Nový dokument/výchozí adresář>v poli Formát vyberte Unix/OSX)