PDA

Bekijk Volledige Versie : Linux maakt -test van '-test'



SebastiaanStok
11/12/10, 18:50
Aangezien ik even aan mezelf begin te twijfelen vraag ik het hier maar. :stuart:

Heel simpel.

Voer dit commando uit op de Linux terminal.


touch '-test'


De waarde staat tussen '' zodat hij altijd goed kan gaan.
Resultaat: touch: ongeldige datumopmaak `est’

Oké, wacht even. Ik plaats een waarde tussen '' zodat hij kan interpreteren als tekst. En toch gaat hij hem als uitvoeren als (zonder aanhalingstekens).

touch -test

Ben ik nu zo dom, of is het gewoon verboden/onmogelijk om een waarde die begint met een streepje te gebruiken?

Ik heb veel meegemaakt maar dit zou echt het toppunt zijn :eek:

DutchTSE
11/12/10, 19:01
Zo te zien ziet hij het commando "touch -test" als "touch" met parameter -t met waarde "est".

Enigszins logisch dat het niet werkt dus ;)

Cakkie
11/12/10, 19:12
touch ./-test

ichat
11/12/10, 19:35
nu ben ik nog niet zo heel erg into linux, maar wat doet touch "\-test" ????

edit: of wat Cakkie zegt

Yourwebhoster
11/12/10, 20:41
nu ben ik nog niet zo heel erg into linux, maar wat doet touch "\-test" ????

edit: of wat Cakkie zegt

\ is van windows en als je dat voor linux zou doen dan kom je in /, dan komt het ergens anders dan waar je bent;) ./ zorgt er voor dat het in dezelfde dir aangemaakt word.

visser
11/12/10, 20:53
\ is van windows en als je dat voor linux zou doen dan kom je in /, dan komt het ergens anders dan waar je bent;) ./ zorgt er voor dat het in dezelfde dir aangemaakt word.

Wel als het gaat om directory separators.
Maar \ is ook een escape character, om aan te geven dat wat erop volgt puur als character gelezen moet worden, en niet als optie of bijvoorbeeld field separator. (spatie in de filenaam, wanneer je " als " wilt meegeven, in plaats van gebruiken als quote etc)

zie bijvoorbeeld :
http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/escapingsection.html

Het weer wissen van files die beginnen met - ,of die unprintable characters bevatten in de filenaam kan ook een beetje lastig zijn. (man rm : rm -- -foo of rm ./-foo ).

Yourwebhoster
11/12/10, 20:54
Klopt, je hebt gelijk.

vDong
11/12/10, 21:25
touch -- -test

-- betekend, stop met parsen van parameters.

SebastiaanStok
11/12/10, 21:33
Ah :) heel apart maar dan ik te minsten dat oude bestand verwijderen.

Wel vreemd dat hij als parameter ziet, het staat tussen '' dus dan zou je verwachten dat hij als tekst ziet. Ik had hem nog door escapeshellargs() gehaald en dat haalde niets uit.

ichat
11/12/10, 23:10
wow cool, ./ kende ik als voer hier uit,
zelf gebruik ik vaker: \ als char-escape - omdat ik dat ook met scripten gewend ben
maar -- kende ik bijv dan weer niet,

!leuk en leerzaam ook

Cybafish
11/12/10, 23:20
De vraag is: waarom gebruikt iedereen 'touch'. Wat een gedoe, gebruik gewoon '>'


root@local [~/testdir]# > -test
root@local [~/testdir]# ls
./ ../ -test


En verwijderen inderdaad door './' ervoor te zetten, de '--' voor de input is eigenlijk meer een workaround dan iets dat echt zo hoort.

systemdeveloper
11/12/10, 23:54
De vraag is: waarom gebruikt iedereen 'touch'. Wat een gedoe, gebruik gewoon '>'

Omdat '>' bash specifiek is en bij veel andere shells niet werkt.
En omdat '>' altijd het bestand overschrijft / opnieuw aanmaakt.

SebastiaanStok
12/12/10, 12:03
En touch was ook als voorbeeld :)

MediaServe
12/12/10, 12:20
wow cool, ./ kende ik als voer hier uit,


Bash probeert bij een pad met een bestand het bestand uit te voeren (mits hij executable is). Als je alleen de bestandsnaam in zou typen dan probeert Bash een commando uit te voeren. Daarom gaat test.sh fout (is geen commando) en ./test.sh goed. De ./ heeft an sich niets met uitvoeren te maken, maar dat is gewoon de kortste manier om een volledig pad te maken van een bestand.

:TLW

visser
12/12/10, 14:51
Bash probeert bij een pad met een bestand het bestand uit te voeren (mits hij executable is). Als je alleen de bestandsnaam in zou typen dan probeert Bash een commando uit te voeren. Daarom gaat test.sh fout (is geen commando) en ./test.sh goed. De ./ heeft an sich niets met uitvoeren te maken, maar dat is gewoon de kortste manier om een volledig pad te maken van een bestand.

:TLW

Deze uitleg mist net de pointe een beetje.
Als je test.sh in /usr/bin/ zet, en executable hebt staan, zal het gewoon uitgevoerd worden als je (ook zonder ./ ) test.sh intikt.
En als de current directory in je PATH zit, dan zal zo'n test scriptje ook zonder een pad mee te geven uitgevoerd worden.

Kortom, een commando zonder pad wordt uitgevoerd als het een shell-builtin is, een alias, of als het executable is die in een directory staat die in het PATH voorkomt.

Wil je een executable uitvoeren die op een plek staat buiten het $PATH, moet je een directory pad meegeven, dat kan een volledig pad zijn (/home/user/test/test.sh , ofzo), of een relatief pad (./ : deze directory ../ : directory omhoog).

Je zou . kunnen toevoegen aan $PATH.

De reden dat dat afgeraden wordt, is dat het een valkuil is qua security wanneer een andere gebruiker (vooral root) een 'gewoon' commando (of een typo voor een commando) probeert uit te voeren op een plek waar een script/executable staat met die naam in de current directory.

Maar als je wat meer eigen scriptjes hebt kun je ze bijvoorbeeld in $HOME/bin zetten, en dan $HOME/bin aan je $PATH toevoegen.

Oja: vergeet de 'she-bang' (#!) niet op de eerste regel van een script om aan te geven met welke interpreter het script uitgevoerd moet worden.
Als je het 'gewoon' als executable wilt starten is dat nodig.

Start je zelf de interpreter, dan is het niet nodig en hoeft het script zelfs niet executable te zijn.
bash test.sh start een nieuwe shell en voert test.sh uit.
. test.sh of source test.sh voert test.sh uit binnen de lopende bash-shell
./test.sh laat de loader test.sh uitvoeren, en als het een script is wordt de interpreter gestart die in de eerste regel moet staan.

#!/bin/bash
echo "Bash script"

#!/usr/bin/perl -w
print "Hello, World";

MediaServe
12/12/10, 16:37
Ik ben het helemaal met je eens, maar wou mijn verhaal iets korter houden :D

Door het pad . toe te voegen aan de $PATH variabele bereik je exact hetzelfde als zelf ./ ervoor zetten.

MediaServe
12/12/10, 16:43
Overigens geeft rm zelf de oplossing voor het probleem van de topicstarter:


thomas@server:~$ rm -test
rm: invalid option -- 't'
Try `rm ./-test' to remove the file `-test'.