ubuntuusers.de

"Kommando nicht gefunden" Bash-Scripting

Status: Gelöst | Ubuntu-Version: Ubuntu 13.10 (Saucy Salamander)
Antworten |

Maddin69

Anmeldungsdatum:
15. April 2014

Beiträge: Zähle...

Hallo allerseits, Ich schreibe gerade ein Script für qemu, die ganze "Vorarbeit" funktioniert prächtig, aber das starten der virtuellen Maschine nicht, die Ausgabe ist :

./first: Zeile 33: qemu-system-x86_64: Kommando nicht gefunden.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/bash
clear
echo "Welcome to the qemu script!"
echo ""
cd ../../../../media/maddin/TOSHIBA\ EXT/
read -p "You want to open qemu? " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]
then 
	exit
else 
	read -p "How much RAM to take? "
	if [ "$REPLY" -le "1023" ] || [ "$REPLY" -ge "6300"]
	then
		echo "The qemu Launcher will terminate now, due to unacceptable ammount of RAM!"
		exit
	else 
		RAM="$REPLY"		
		echo "The RAM is now set to "$RAM" MB RAM."
	fi			
	read -p "You want to mount an .iso file? " -n 1 -r
	echo
	if [[ $REPLY =~ ^[Yy]$ ]]
	then 
		echo "The .iso files on the EXT HDD are: "
		find . -type f -name "*.iso" -printf "%f\n" | sort
		echo ""			
		read -p "Which .iso File you want to mount? "
		PATH=$(find . -type f -name "$REPLY")
		read -p "You want to run qemu now? " -n 1 -r
		if [[ $REPLY =~ ^[[Yy]$ ]]
		then 
			`qemu-system-x86_64 -enable-kvm -m "$RAM" -vga std -daemonize media/maddin/TOSHIBA\ EXT/Dokumente/qemu/disk.qcow2 -cdrom "$PATH"`
			echo ""
		else 
			echo ""			
			exit
		fi
	fi 
	read -p "You want to run qemu now? " -n 1 -r 	
	if [[ $REPLY =~ ^[[Yy]$ ]]
	then 
		`qemu-system-x86_64 -enable-kvm -m "$RAM" -vga std -daemonize ../../../../media/maddin/TOSHIBA\ EXT/Dokumente/qemu/disk.qcow2`
		echo ""
		else 
			echo ""			
			exit
	fi
fi

D630

Avatar von D630

Anmeldungsdatum:
24. Juli 2013

Beiträge: 329

Hi,

auf den ersten Blick würde ich sagen, dass Du in Zeile 29 die bash-Variable "PATH" überschreibst, sodass die bash nicht weiß, wo qemu-system-x86_64 liegt. Die entsprechende Zeile daher umbennen zB in:

1
iso=$(find . -type f -name "$REPLY")

Oder qemu-system-x86_64 genau lokalisieren und angeben. Aber lieber oberes verändern.

Benno-007

Anmeldungsdatum:
28. August 2007

Beiträge: 29240

Wohnort: Germany

Was sollen denn die Backticks bei

`qemu-system-x86_64...`

? Mach die raus, dann sollte es laufen. Damit lenkt man Werte in Variablen um:

variable=`ls /`
echo $variable

Neuere Schreibweise ist:

variable=$(ls /)

Bei dir hat das gar nichts verloren...

Edit: Richtig: Und path solltest du kleinschreiben, denn PATH ist eine vergebene Systemvariable mit den Ordnern, wo die Befehle und Programme gesucht werden:

echo $PATH

Zur Verdeutlichung deines anderen Problems:

$ `ls /`
Der Befehl »bin« wurde nicht gefunden, meinten Sie vielleicht:
[...]

Funktioniert so überhaupt nicht!

D630

Avatar von D630

Anmeldungsdatum:
24. Juli 2013

Beiträge: 329

Ja, Backticket command substitution wird nicht mehr gern benutzt; stattdessen lieber mit $(). Dazu in Greg's Wiki eine Argumentation. Über weitere unbeliebte Syntax erfährt man hier und hier etwas.

Benno-007 schrieb:

? Mach die raus, dann sollte es laufen. Damit lenkt man Werte in Variablen um:

In der Praxis macht man dies gern. Generell/Theoretisch ist es einfach dazu da, den Output eines Kommandos zu expandieren (wobei das Kommando in einer Subshell ausgeführt wird), denk ich.

1
2
3
4
echo `ls /`
echo $(ls /)
echo "`ls /`"
echo "$(ls /)"

Zur Verdeutlichung deines anderen Problems:

$ `ls /`
Der Befehl »bin« wurde nicht gefunden, meinten Sie vielleicht:
[...]

Funktioniert so überhaupt nicht!

Ein set -x sagt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
`ls /`
++ ls --color=auto /
+ bin boot dev etc home initrd.img initrd.img.old lib lib32 lib64 libx32 lost+found media mnt opt proc root run sbin srv sys tmp usr var vmlinuz vmlinuz.old
+ '[' -x /usr/lib/command-not-found ']'
+ /usr/lib/command-not-found -- bin
Der Befehl »bin« wurde nicht gefunden, meinten Sie vielleicht:
 Befehl »ben« aus dem Paket »ben« (universe)
 Befehl »bins« aus dem Paket »bins« (universe)
 Befehl »bip« aus dem Paket »bip« (universe)
 Befehl »bio« aus dem Paket »barry-util« (universe)
 Befehl »win« aus dem Paket »wily« (universe)
 Befehl »bing« aus dem Paket »bing« (universe)
 Befehl »bino« aus dem Paket »bino« (universe)
 Befehl »tin« aus dem Paket »tin« (universe)
bin: Befehl nicht gefunden.

So funktioniert es dann:

1
2
`ls / 2>/dev/null`
``ls /``

Aber klar, command substitution ist in dem Fall von Maddin69 überflüssig.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17620

Wohnort: Berlin

D630 schrieb:

Aber klar, command substitution ist in dem Fall von Maddin69 überflüssig.

Nein, es ist nicht überflüssig - es ist falsch.

Überflüssig ist etwas, das richtig aber nicht nötig ist. Es ist aber nicht richtig.

tischbein

Avatar von tischbein

Anmeldungsdatum:
21. Juli 2008

Beiträge: 404

Du überschreibst in deinem Script die variable $PATH.
Diese variable enthält Pfade, welche Bash nutzt um herauszufinden wo eine anwendung liegt.

Einfach nur kleingeschriebene variablen nutzen: Statt $PATH verwende $path, usw.

Antworten |