‘\r’: commando niet gevonden – .bashrc / .bash_profile

Ik heb windows die Cygwin gebruiken en proberen JAVA_HOMEpermanent in te stellen via mijn .bashrc-bestand.

.bashrc:

export PATH="$JAVA_HOME/bin:$PATH"  
export JAVA_HOME=$JAVA_HOME:"/cygdrive/c/Program Files (x86)/Java/jdk1.7.0_05"

.bash_profile:

if [ -f ~/.bashrc ]; then
   source ~/.bashrc
fi

lopende cygwin:

-bash: $'\377\376if': command not found
-bash: $'then\r': command not found
: No such file or directorysu//.bashrc
-bash: /cygdrive/c/Users/jhsu//.bash_profile: line 3: syntax error near unexpected token `fi'
-bash: /cygdrive/c/Users/jhsu//.bash_profile: line 3: `fi'

Ik weet niet zeker of ik de commando’s heb overgenomen van een tutorial die bedoeld was voor een ander systeem of dat ik een stap mis. Of witruimte zorgt ervoor dat mijn opdrachten niet correct worden uitgevoerd.

Ik heb meerdere vergelijkbare vragen bekeken, maar ik heb er geen gevonden waarbij de vraag precies mijn fout bevat.


Mijn thuispad:

$ echo $HOME
/cygdrive/c/Users/jhsu
$ echo ~
/cygdrive/c/Users/jhsu/

Dus ik vind dat de bestanden op de juiste plek moeten worden geplaatst.


Antwoord 1, autoriteit 100%

Als al het andere faalt in Cygwin…

Probeer de opdracht dos2unixuit te voeren op het betreffende bestand.

Het kan helpen als u foutmeldingen als deze ziet:

-bash: '\r': command not found

Nieuweregeltekens in Windows-stijl kunnen problemen veroorzaken in Cygwin.

De opdracht dos2unixpast nieuwe regeltekens aan zodat ze Unix / Cygwin-compatibel zijn.

VOORZICHTIG:het dos2unix-commando wijzigt bestanden op hun plaats, dus neem indien nodig voorzorgsmaatregelen.

Als u het originele bestand wilt bewaren, moet u er eerst een back-up van maken.

Opmerking voor Mac-gebruikers:de opdracht dos2unixbestaat niet op Mac OS X.

Bekijk dit antwoordvoor verschillende oplossingen met verschillende tools.


Er is ook een unix2doscommando dat het omgekeerde doet:

Het wijzigt Unix newline-tekens zodat ze compatibel zijn met Windows-tools.

Als je een bestand opent met Kladblok en alle regels lopen door elkaar, probeer dan unix2dos filename.


Antwoord 2, autoriteit 76%

Voor degenen die dos2unixniet hebben geïnstalleerd (en het niet willen installeren):

Verwijder het laatste \rteken dat deze fout veroorzaakt:

sed -i 's/\r$//' filename

Uitleg:

Optie -iis voor in-placebewerking, we verwijderen de achterliggende \rdirect in het invoerbestand. Zorg er dus voor dat u het patroon correct typt.


Antwoord 3, autoriteit 25%

Voor WINDOWS(shell) gebruikers met Notepad++(gecontroleerd met v6. 8.3) kunt u het specifieke bestand corrigeren met de optie
– Bewerking
-> EOL-conversie
-> Unix/OSX-formaat

En sla je bestand opnieuw op.

Bewerken: werkt nog steeds in v7.5.1 (29 aug. 2017)


Antwoord 4, autoriteit 10%

Ik gebruik cygwin en Windows7, de truc was NIET om de set -o igncrin je .bashrc te zetten, maar de hele SHELLOPTSin je omgevingsvariabelen onder Windows . (Dus niets met unix / cygwin…) Ik denk dat het niet werkt vanuit .bashrcomdat “de drops al gezogen zijn”
zoals we in het Duits zouden zeggen. 😉
Dus mijn SHELLOPTSziet er zo uit

braceexpand:emacs:hashall:histexpand:history:igncr:interactive-comments:monitor

Antwoord 5, autoriteit 8%

SUBLIEME TEKST

Bij subliem ga je gewoon naar

Bekijken – > Regeleinden -> (select)Unix

Sla het bestand vervolgens op. Zal dit probleem oplossen.

Zo simpel is het!


Antwoord 6, autoriteit 7%

Als je een recente Cygwin gebruikt (bijv. 1.7), kun je ook je .bashrcen .bash_profilestarten met de volgende regel, op de eerste niet-becommentarieerde regel regel:

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
(set -o igncr) 2>/dev/null && set -o igncr; # this comment is needed

Hierdoor wordt bash gedwongen de regelteruglooptekens (\r) die worden gebruikt in regelscheidingstekens in Windows te negeren.

Zie http://cygwin.com/ml/cygwin-announce/2010-08/ msg00015.html.


Antwoord 7, autoriteit 5%

De fout:

'\r': opdracht niet gevonden

wordt veroorzaakt doordat shell niet in staat is om Windows-achtige CRLF-regeleindes te herkennen (0d 0a) zoals het alleen LFverwacht (0a) .


Git

Als je Git op Windows gebruikt, zorg er dan voor dat je ‘Checkout as-is‘ hebt geselecteerd tijdens de installatie. Zorg er dan voor dat je het volgende uitvoert: git config --global core.autocrlf false, zodat Git geen conversies zal uitvoeren bij het uitchecken of het vastleggen van tekstbestanden.


dos2unix

Als je Git niet gebruikt, hoef je alleen deze betrokken bestanden/scripts terug te converteren naar Unix-achtige regeleindes (LF), ofwel door:

dos2unix ~/.bashrc

Opmerking: de opdracht dos2unixmaakt deel uit van het pakket dos2unix.

Ex/Vim-editor + tr

Als je Vim hebt geïnstalleerd, zou de volgende opdracht de bestanden moeten corrigeren:

ex +'bufdo! %! tr -d \\r' -scxa ~/.bash*

Handige alias: alias dos2unix="ex +'bufdo! %! tr -d \\\\r' -scxa".

tr

Hier is de methode met behulp van tr:

cat ~/.bashrc | tr -d '\r' > ~/.bashrc.fixed && mv -v ~/.bashrc.fixed ~/.bashrc

of:

tr -d '\r' < filename > new_filename

Opmerking: de \ris gelijk aan \015.


sed

Je kunt het volgende commando proberen:

sed -i'.bak' s/\r//g ~/.bash*

recode

De volgende aliassen kunnen nuttig zijn (die de opdracht dos2unixvervangen):

alias unix2dos='recode lat1:ibmpc'
alias dos2unix='recode ibmpc:lat1'

Bron: Gratis Unix-tools (ssh, bash, enz.) onder Windows.


perl

Het volgende perlcommando kan het bestand van DOS naar Unix formaat converteren:

perl -p -i.bak -e 's/\015//g' ~/.bash*

Bron: het strippen van de ^M.


tofrodos

Op Linux, zoals Ubuntu dat niet standaard wordt geleverd met dos2unixof unix2dos, kun je het tofrodos-pakket installeren (sudo apt-get install tofrodos), en definieer de volgende aliassen:

alias dos2unix=’fromdos’
alias unix2dos=’todos’

Gebruik vervolgens in dezelfde syntaxis als hierboven.


Zerver

Als je Vagrant VM gebruikt en dit gebeurt voor het inrichten van een script, probeer dan de binaryoptie in te stellen op true:

# Shell provisioner, see: https://www.vagrantup.com/docs/provisioning/shell.html
config.vm.provision "shell" do |s|
  s.binary = true # Replace Windows line endings with Unix line endings.
  s.path = "script.sh"
end

Zie: Windows CRLF naar Unix LF-problemen in Vagrant.


Antwoord 8, autoriteit 4%

Je kunt ook de optie -o igncrtoevoegen aan de bash-aanroep, bijvoorbeeld

bash -x -o igncr script.sh

Antwoord 9, autoriteit 4%

probeer de volgende opdracht uit te voeren

vim .bashrc
:set ff=unix
:wq!

Antwoord 10, autoriteit 2%

Volgens deze gistis de oplossing om een ~/.bash_profile(in HOMEdirectory) die het volgende bevat:

export SHELLOPTS
set -o igncr

Antwoord 11, autoriteit 2%

Misschien heb je notepad++ gebruikt voor het maken/bijwerken van dit bestand.

EOL(Edit->EOL Conversion) Conversie is standaard Windows.

EOL-conversie wijzigen in Notepad++

Edit -> EOL Conversion -> Unix (LF)

Antwoord 12

Opgelost met Notepad++ :

1) Menu->Bewerken->EOL-conversie -> Unix/OSX-indeling

2) Dan Opslaan

Opgelost


Antwoord 13

mensen die notepad++(6.8.1) gebruiken om shellscripts van Windows naar Linux te verzenden.

stel het volgende in in kladblok ++
Bewerken -> EOL-conversie -> Unix/OSX-formaat


Antwoord 14

Ik had hetzelfde probleem. Oplossing: ik bewerk het bestand met de pspad-editor en geef het een unix-formaat (Menu – Format -> UNIX)

Ik geloof dat je dit formaat met veel andere editors voor je bestand kunt instellen


Antwoord 15

Voor de Emacs-gebruikers die er zijn:

  1. Open het bestand
  2. M-x set-buffer-file-coding-system
  3. Selecteer “unix”

Hiermee worden de nieuwe tekens in het bestand bijgewerkt naar Unix-stijl. Meer informatie over “Newline Representation” in Emacs vindt u hier:

http://ergoemacs.org/emacs/emacs_line_ending_char.html

Opmerking: de bovenstaande stappen kunnen worden omgezet in een Emacs-script als men dit liever vanaf de opdrachtregel uitvoert.


Antwoord 16

Het probleem is mogelijk ontstaan vanwege het bestand/script dat is gemaakt/gedownload van een Windows-computer. Probeer het te converteren naar het linux-bestandsformaat.

dos2unix ./script_name.sh

of

dos2unix ~/.bashrc

Antwoord 17

Als u het vim-pakket op uw Cygwin-installatie hebt geïnstalleerd, kunt u vim gebruiken om dit op te lossen zonder & vervangen. Start vim als volgt: vim filename.sh(vaak is het ook een alias naar vi). Typ vervolgens :set fileformat=unixen vervolgens :wq(schrijf en stop) om uw wijzigingen op te slaan. (De :zet je in de bewerkmodus van vim.)

Ik raad dit aan boven dos2unix omdat vim waarschijnlijk vaker wordt geïnstalleerd.

Het is echter waarschijnlijk een best practice om uw teksteditor in te stellen om bestanden die u van plan bent te gebruiken in een Unix/Linux-omgeving op te slaan in een Unix-tekstindeling. De bovenstaande antwoorden voor Notepad++ zijn een goed voorbeeld.

Aanvullende opmerking: als je niet zeker weet welk type een bestand is (DOS of Unix), kun je het file filename.shgebruiken. Dit kan vooral helpen bij het oplossen van meer obscure problemen (zoals coderingsproblemen bij het importeren van SQL-dumps die afkomstig zijn van Windows).

Zie dit IU-kennisbankartikel

Meer achtergrondinformatie over Bash-scripts en regeleindes is te vinden op deze StackOverflow-vraag.


Antwoord 18

In EditPlusdoe je dit vanuit de
Document → File Format (CR/LF) → Change File Format...menu en kies vervolgens het keuzerondje Unix / Mac OS X.


Antwoord 19

1. Keuze

EditorConfigEditorConfig— is mijn keuze.


2. Relevantie

Dit antwoord is relevant voor maart 2018. In de toekomst kunnen de gegevens van dit antwoord verouderd zijn.

Auteur van dit antwoord gebruikte EditorConfig persoonlijk in maart 2018.


3. Beperkingen

Je moet een van de ondersteunde IDE/editorsgebruiken.


4. Argumentatie

  1. Gewoon gebruik. Ik moet mijn .editorconfig-bestand 1 keer instellen, waar ik mijn project maak, → ik kan enkele platform-, stijl- en IDE-specifieke problemen.
  2. Cross-platform, cross-talen, cross-IDE, cross-editors.

5. Voorbeeld

5.1. Eenvoudig

Ik installeer EditorConfig-plug-invoor Sublime Text → mijn tekst editor. Ik bewerk bestanden in Sublime Text.

Ik heb bijvoorbeeld het bestand sashacrlf.sh:

echo "Sasha" &
echo "Goddess!" &

Ik voer dit bestand uit in Cygwin:

$ bash sashacrlf.sh
Sasha
sashacrlf.sh: line 1: $'\r': command not found
Goddess!

Ik maak een bestand .editorconfigaan in hetzelfde project als sashacrlf.sh.

[*.sh]
end_of_line = lf

Het betekent dat als u een bestand met de extensie .shin uw project opslaat in uw editor, EditorConfig UNIX-regeleinden instelt voor dit bestand.

Ik sla sashacrlf.shopnieuw op in mijn teksteditor. Ik voer sashacrlf.shopnieuw uit:

$ bash sashacrlf.sh
Sasha
Goddess!

Ik krijg geen onverwachte uitvoer in de console.

5.2. Meerdere bestandsextensies

Ik wil bijvoorbeeld UNIX-regeleinden hebben in alle bestanden met de extensies .sh, .bashrcen .bash_profile.
Ik voeg deze regels toe aan mijn .editorconfig-bestand:

[*.{sh,bashrc,bash_profile}]
end_of_line = lf

Als ik nu een bestand opsla met de extensie .sh, .bashrcof .bash_profile, stelt EditorConfig hier automatisch het UNIX-regeleinde voor in bestand.


6. Extra links

Other episodes