Fragen zu Scripten in FreeBSD

Status
Für weitere Antworten geschlossen.

logoft

Well-Known Member
Hallo Leute,

ich weiß das vieles wie eine Programmiersprache geschrieben wird. Bei Linux macht man dann diese Datei ausführbar. Nur was mußich wissen um so eine Datei unter BSD auszuführen? Wie heißt so eine Datei- Skript-Datei? Kann ich da auch alles reinschreiben wie auf dem Prompt? In welchem Verzeichnis sollten solche Dateien dann sitzen?

Am besten ihr gibt mir ein Link wo ich alles nachlesen kann. Ich habe bisher noch nichts gefunden.

Danke
 
Was genau hast du denn vor?
Ja man kann scripte schreiben. Das sind Textdateien die die Fähigkeiten der Shell nutzen um kleine Programme darzustellen. Ganz primitiv sind das einfach hintereinander gereihte Programmaufrufe, kann aber auch deutlich komplexer werden mit Kontrollstrukturen wie man sie aus Programmiersprachen kennt. Shell-Scripte sind jedoch etwas kryptisch zu lesen und zu schreiben am Anfang. Hier im Wiki gibt es ein recht gutes HowTo hierzu: http://wiki.bsdforen.de/howto:shell-scripting

Willst du einige Befehle direkt beim Start des Systems ausführen (worauf ich mal tippen würde wegen deiner Erwähnung der "autoexec.bat") dann sind das rc.scripte. Dabei handelt es sich um Scripte die beim Starten des Systems interpretiert werden. Diese können Abhängigkeiten voneinander haben (z.B. "Dieses Script kann erst gestartet werden wenn Netzwerk verfügbar ist") oder Dienste anbieten (z.B. "wenn dieses Script durchgelaufen ist haben wir Netzwerk"). Für recht einfache Dinge gibt es die rc.local. (Zur rc.local gab es hier erst einen Thread)

rc.scripte müssten an der richtigen Stelle unterhalb /etc liegen. Bei normalen Scripten ist das dir überlassen. Wenn sie im Pfad liegen (also in einem Verzeichnis das in der PATH-Variable enthalten ist) dann kannst du sie von überall her aufrufen, wenn sie wo anders liegen musst du beim Aufruf im Allgemeinen den Pfad zusätzlich angeben. Das ist aber auch kein Beinbruch.

So nun hast du glaub ich genug Stichworte nach denen du suchen kannst. Und riskier mal einen Blick in da Handbuch in die Manpages.

P.S. ich hab den Titel mal etwas aussagekräftiger gemacht
 
Ja hallo,

durch die Aussagekraft habe ich das Thema nicht gleich wieder gefunden :-))

Wenn ich das WLAN jedesmal anschalten müßte, dann würde ich das gerne von einer Datei erledigen lassen. Oder ich würde die NumLock einschalten.

Ich würde auch malProgramme starten. Nur wie funktioniert das? Ich dachte halt es wären einfache Befehle wie in einer Autoexec.bat wo man mit IF THEN Entscheidungen treffen kann und sie dann bei GOTO ausführt. Wenn das wie eine Programmiersprache wäre,dann wäre mir das zu kompliziert. Ich kann nicht programmieren und so wäre ich mit einer Skript-Datei übefordert.

mfg
 
Das macht vermutlich jeder von uns auf die ein oder andere Weise, dass er scripte nutzt, um Dinge zu automatisieren. Die einfachsten Scripte sind vermutlich die shell-scripte, denn "die shell" ist gleich an Bord kann diese scripte direkt interpretieren. Man braucht die nur zu schreiben und dann rechtzeitig auszuführen.

Die Frage ist nun, waswannwo?
Du schreibst vom Numlock. Den könnte man zB direkt zum Systemstart schon wünschen, oder erst, nachdem man sich ins System gelogged hat, oder erst, nachdem X gestartet ist, oder erst, nachdem das Desktop-Environment (DE) gestartet ist. Und dann, möchtest du vielleicht jeweils in anderen zuständen den Numlock wieder abschalten. Ähnlich kompliziert ist das mit Netzwerk und WLan. Traditionell sind das Aufgaben, die zur Bootzeit vorgenommen werden. Da wird das Netzwerk gesetzt, die Uhrzeit abgeholt, freigaben eingebunden und ähnliche Dinge. Aber, manche PCs stehen nicht still an einem Ort und sind nicht immer im gleichen Netz. Da macht man sich dann Sorgend, dass richtige Einstellungen für jedes erkannte Netz gefunden werden, legt vielleicht Profile an und setzt dann entsprechend das Netz und bindet mal Freigaben ein und ein anderes Mal nicht oder wählt auch unterschiedliche IP-Adressen und Dienste. Vielleicht nutzt man aber auch in seinem DE eine Mechanik, die es dem Nutzer erlaubt, diese Einstellungen noch später vorzunehmen, also lange, nachdem das System gebootet hat.

Solche Entscheidungen musst du als Sysadmin deines Systems finden. Dazu gehört, dass man die verschiedenen Wege ein wenig kennen lernt und wenn jemand dir helfen soll, dann muss man deine Vorstellung und deine Voraussetzung dafür kennen. In einem einfachen Fall genügt als Antwort auf deine Frage ein Verweis ins Handbuch, wo etwa das dauerhafte Einrichten von WLan beschrieben wird und auch etwas zu lagg-devices erklärt wird, die man dann vielleicht auch haben möchte. x11/numlockx ist eine Möglichkeit, unter X den Numlock zu aktivieren. Das Programm wird installiert und dann ohne Optionen aufgerufen. Das kann auch in einer autostart-Datei in einem Script stehen. Aber, ob es auch das ist, wonach du suchst, weiß ich nicht. Bei mir wirkt das zuverlässig und ich nutze aber auch kein DE. Manche DEs haben dafür bereits Einstellungen an Bord, die du finden musst.
 
fällt mir eben noch auf und ein: nummlockx schaltet ohne Optionen den Numlock ein. Meist existiert eine Lampe, die das anzeigt. Man kann aber mit numlockx off auch ausschalten und mit toggle wechseln. So kann man eine Schöne Übung für ein kleines Script erdenken und die Lampe mal blinken lassen. Vielleicht während einer Phase des Bootens oder so, um etwas versteckt eine kleine Action zu produzieren.
 
Du musst bei deinen Fragestellungen konkreter werden: welches Programm möchtest du starten?

Wenn du "autoexec.bat" ansprichst: Du möchtest also etwas nach dem Start des Systems automatisch ausführen?

Rob


Ich will wissenswertes wissen. Ein Vogel hat Flügel und Füße. Ein Auto hat 4 Räder und ein 5. manchmal im Kofferraum.

So und was sollte man über eine Script-Datei wissen? Welche Endung hat die Datei? Muß ich sie ausführbar machen mit nem Flag? Muß ich die Option Script in der Datei laden oder geht das sofort? Wodurch wird sie ausführbar?

Das sind 100 Fragen. Ich will nicht ein Programm starten, mich interessiert das was man wissen sollte - was sich in 3 Minuten erklären könnte.

mfg
 
Das macht vermutlich jeder von uns auf die ein oder andere Weise, dass er scripte nutzt, um Dinge zu automatisieren. Die einfachsten Scripte sind vermutlich die shell-scripte, denn "die shell" ist gleich an Bord kann diese scripte direkt interpretieren. Man braucht die nur zu schreiben und dann rechtzeitig auszuführen.

Die Frage ist nun, waswannwo?
Du schreibst vom Numlock. Den könnte man zB direkt zum Systemstart schon wünschen, oder erst, nachdem man sich ins System gelogged hat, oder erst, nachdem X gestartet ist, oder erst, nachdem das Desktop-Environment (DE) gestartet ist. Und dann, möchtest du vielleicht jeweils in anderen zuständen den Numlock wieder abschalten. Ähnlich kompliziert ist das mit Netzwerk und WLan. Traditionell sind das Aufgaben, die zur Bootzeit vorgenommen werden. Da wird das Netzwerk gesetzt, die Uhrzeit abgeholt, freigaben eingebunden und ähnliche Dinge. Aber, manche PCs stehen nicht still an einem Ort und sind nicht immer im gleichen Netz. Da macht man sich dann Sorgend, dass richtige Einstellungen für jedes erkannte Netz gefunden werden, legt vielleicht Profile an und setzt dann entsprechend das Netz und bindet mal Freigaben ein und ein anderes Mal nicht oder wählt auch unterschiedliche IP-Adressen und Dienste. Vielleicht nutzt man aber auch in seinem DE eine Mechanik, die es dem Nutzer erlaubt, diese Einstellungen noch später vorzunehmen, also lange, nachdem das System gebootet hat.

Solche Entscheidungen musst du als Sysadmin deines Systems finden. Dazu gehört, dass man die verschiedenen Wege ein wenig kennen lernt und wenn jemand dir helfen soll, dann muss man deine Vorstellung und deine Voraussetzung dafür kennen. In einem einfachen Fall genügt als Antwort auf deine Frage ein Verweis ins Handbuch, wo etwa das dauerhafte Einrichten von WLan beschrieben wird und auch etwas zu lagg-devices erklärt wird, die man dann vielleicht auch haben möchte. x11/numlockx ist eine Möglichkeit, unter X den Numlock zu aktivieren. Das Programm wird installiert und dann ohne Optionen aufgerufen. Das kann auch in einer autostart-Datei in einem Script stehen. Aber, ob es auch das ist, wonach du suchst, weiß ich nicht. Bei mir wirkt das zuverlässig und ich nutze aber auch kein DE. Manche DEs haben dafür bereits Einstellungen an Bord, die du finden musst.

Mir schwebt vor zum Beispiel alle Programme die ich installiere in eine Datei zu schreiben um sie wieder installieen zu können.
'pkg install hallejullia'
'pkg install Papst"
'start mc auf tty5'

Oder 'ls -G *.*' färbt einmalig Namen bunt.

Wie macht man das? Was muß ich dazu wissen?
 
fällt mir eben noch auf und ein: nummlockx schaltet ohne Optionen den Numlock ein. Meist existiert eine Lampe, die das anzeigt. Man kann aber mit numlockx off auch ausschalten und mit toggle wechseln. So kann man eine Schöne Übung für ein kleines Script erdenken und die Lampe mal blinken lassen. Vielleicht während einer Phase des Bootens oder so, um etwas versteckt eine kleine Action zu produzieren.


.. ich habe am Schleppi keine Lampe. Aber genau das ist was ich meine.Progamme auf dem Prompt aus einer Datei heraus starten und das vielleicht noch im andeen Task.
 
Wenn du dich allumfassend informierten willst empfehle ich dir zu einem Buch zu greifen, oder erwartest du, dass dir hier jemand ein Thema allumfassend erklären kann was manche Bücher nicht können? Z.B das hier http://www.amazon.de/dp/0596005954

Eben das will ich nicht. Zum Beispiel würde mir ein Beispiel helfen wasw möglich wäre.
Kann man ls in einem Skript ausführen? Kann man per Script in ein anderes Verzeichnis wechseln? Das als Beispiel. Dazu muß man keine Romane schreiben, wenn man das Thema nur "anreißt". Als Ergebnis erhoffe ich mir zu sehen ob sich Skripte wie eine autoexec.bat verhalten - nicht mehr und nicht weniger.
 
Hallo Rakor,

einige Mails weiter oben haste ein Link zu der Shell-Skript gesetzt. Ich habe da gerade mal reingesehen. Dort werden Programme aufgerufen, welche wie auf dem Prompt wie zum Beispiel ifconf.

Die Frage ist somit beantwortet und nennt sich Shell-Skript.

Danke
 
Aber, was, wenn du mit einer vollkommen falschen Vorstellung der Sache gegenüber stehst? Wenn das eben nicht so ist, dass man etwas von großer Komplexität in drei Zeilen ausreichend und allgemeinverbindlich erklären kann?

Scripts können so etwas, wie die autoxec.bat früher, aber sie können noch sehr viel mehr.
Hier kommt nun eine Platzverschwendung, nämlich das script zu dem Befehl pkg_libchk aus sysutils/bsdadminscripts:
Code:
#!/bin/sh -f
#
# Copyright (c) 2007-2009
# Dominic Fandrey <kamikaze@bsdforen.de>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

readonly name=pkg_libchk
readonly version=1.6.1
readonly osname=`uname -s`
readonly pkgng=`make -f /usr/share/mk/bsd.port.mk -V WITH_PKGNG`

# Use a line break as delimiter.
IFS='
'

# Filename prefix for shared data
sharedprefix="/tmp/$$"
shared="locks"

#
# This function remembers a lock to allow later deletion with the 
# lockUnregisterAll() function.
#
# @param $1
#	The name of the lock.
lockRegister() {
	local lock
	lock="$sharedprefix-$shared"
	lockf -k "$lock" sh -c "
		if ! grep -qE '^$1\$' '$lock'; then
			echo '$1' >> '$lock'
		fi
	"
}

#
# Unregisters all locks.
#
lockUnregisterAll() {
	wait
	for register in $(cat "$sharedprefix-$shared"); {
		lockf "$sharedprefix-$register" wait
	}
	lockf "$sharedprefix-$shared" wait
}

#
# This function creates a semaphore.
#
# @param $1
#	The name of the semaphore.
# @param $2
#	The size of the semaphore.
#
semaphoreCreate() {
	local lock
	lockRegister "semaphore-$1"
	lock="$sharedprefix-semaphore-$1"
	lockf -k "$lock" echo "$2" > "$lock"
	eval "semaphore_$1_size=$2"
}

#
# This function waits until the semaphore is free und registers its use.
# Everything that uses this also has to call the semaphoreFree() function.
#
# @param $1
#	The name of the semaphore.
#
semaphoreUse() {
	local lock semaphores
	lock="$sharedprefix-semaphore-$1"
	while ! lockf -k "$lock" sh -c "
			state=\$(cat '$lock')
			if [ \"\$state\" -gt 0 ]; then
				echo \"\$((\$state - 1))\" > '$lock'
				exit 0
			fi
			exit 1
		"; do
		sleep 0.1
	done
}

#
# This function frees a semaphore.
#
# @param $1
#	The name of the semaphore.
#
semaphoreFree() {
	local lock
	lock="$sharedprefix-semaphore-$1"
	lockf -k "$lock" sh -c "
		state=\"\$((\"\$(cat '$lock')\" + 1))\"
		echo \"\$state\" > '$lock'
	"
}

#
# This function sets a new status and prints it.
#
# @param $1
#	The status message.
# @param $clean
#	If set status handling is disabled.
#
statusSet() {
	# In clean mode status handling is disabled.
	test -z "$clean" || return 0
	local lock
	lock="$sharedprefix-status"
	lockf -k "$lock" sh -c "
		status=\"\$(cat '$lock')\"
		echo '$1' > '$lock'
		printf \"\\r%-\${#status}s\\r\" '$1' > /dev/tty
	"
}

#
# This function prints a message and the current status behind it.
#
# @param $1
#	The message to print.
# @param $clean
#	If set the status will not be printed.
#
statusPrint() {
	if [ -z "$clean" ]; then
		local lock
		lock="$sharedprefix-status"
		lockf -k "$lock" sh -c "
			status=\"\$(cat '$lock')\"
			printf \"%-\${#status}s\\r\" '' > /dev/tty
			echo '$1'
			printf '%s\\r' \"\$status\" > /dev/tty
		"
	else
		echo "$1"
	fi
}

#
# Waits for a semaphore to be completely free and counts down the remaining
# number of locks.
#
# @param $1
#	The semaphore to watch.
# @param $2
#	The status message to print, insert %d in the place where the number
#	of remaining locks belong.
#
semaphoreCountDown() {
	local free size
	while read -t1 free < "$sharedprefix-semaphore-$1"; do
		size=$(eval "echo \$semaphore_$1_size")
		statusSet "$(printf "$2" $(( $size - $free )))"
		test "$free" -eq "$size" && break
		sleep 0.1
	done
	wait
}

# Clean up upon exit.
trap '
	semaphoreCountDown jobs "Terminated by signal, waiting for %d jobs to die."
	echo > /dev/tty
	lockUnregisterAll
	exit 255
' int term

#
# This function checks whether a given binary or library directly depends
# on a missing library.
# It goes a long way to prevent all kinds of false positives.
# It always returns 2 (false) for Linux and other non-native libraries
# and binaries.
# It also checks whether the missing dependency is really a direct dependency
# (indirect dependencies have to be fixed somewhere else).
#
# @param $1
#	The library or binary to check.
# @return
#	Returns 0 (true) if a library is missing.
#	Returns 1 if everything is all right.
#	Returns 2 if the check cannot be performed (not a native library).
#
dependencyMissing() {
	local missing file direct libfound

	# We cannot handle non-native binaries,
	# so assume everything is in order.
	if ! readelf -e "$1" 2>&1 | \
		grep -E "^[[:space:]]*OS/ABI:[[:space:]]*UNIX - $osname\$" \
		> /dev/null
	then
		return 2
	# Nothing is missing.
	elif ! missing="$(ldd "$1" 2>&1 | grep -E "$match_expr")"; then
		return 1
	fi

	# The return status. The value 1 assumes that this is a false positive.
	status=1

	# Only report misses for direct dependencies.
	direct="$(
			readelf -d "$1" 2> /dev/null | \
				grep 'Shared library:' | \
				sed -E -e 's|^[^[]*\[||1' -e 's|\]$||1'
	)"

	# Compare every missing depency with the list of direct dependencies
	# and report that the dependency is missing if the missing file is
	# a direct dependency.
	for file in $missing; {
		# Strip the missing file of additional information.
		file="$(echo "$file" | sed -E \
			-e 's| => .*$||1' \
			-e 's|^[[:space:]]*||1' \
			-e 's|^.*dependency ||1' \
			-e 's| not found$||1'
		)"

		# If in mean mode we do not check for false positives.
		if [ -n "$mean" ]; then
			test -n "$raw" && return 0
			statusPrint "$package_name: $1 misses $file"
			continue
		fi

		# Handle the case where a library is not found, but exists
		# somewhere in the package. This is for packages that do not
		# rely on the OS to find libraries.
		libfound=
		for library in $(echo "$libraries" | grep -E "/$file\$"); {
			# The library exists after all.
			test -e "$library" && libfound=1 && break
		}
		if test "$libfound"; then
			test -n "$verbose" && statusPrint "$package_name: \
located: $1 misses $file found at $library."
			continue
		fi

		# Compare the file with the list of direct dependencies.
		# If it's not in than it's only an indirect dependency and
		# cannot be fixed by rebuilding this port.
		if echo "$direct" | grep -E "^$file\$" > /dev/null; then
			test -n "$raw" && return 0
			statusPrint "$package_name: $1 misses $file"
			status=0
		elif [ -n "$verbose" ]; then
			statusPrint "$package_name: inderect: $1 \
misses $file is an inderect dependency."
		fi
	}

	return $status
}

#
# Checks the parameters for options.
#
# @param $packages
#	The parameters to pkg_info -E that will result in the
#	names of the packages to work on.
# @param $recursive
#	Contains the appropriate parameter to get the
#	dependencies of the given packages from pkg_info.
# @param $Recursive
#	Contains the appropriate parameter to get the
#	packages depending on the given packages from pkg_info.
# @param $raw
#	Is set to trigger raw printing.
# @param $clean
#	Is set to trigger printing without status messages.
# @param $verbose
#	Is set to be verbose about false positives.
# @param $mean
#	Is set to switch into mean mode. That means no
#	checking of false positives.
# @param $compat
#	Delete to avoid detecting compat libraries as misses.
# @param $origin
#	Is set to turn the print origin mode on.
# @semaphore jobs
#	Is set to limit the amount of parallel jobs.
#
readParams() {
	local option

	for option {
		case "$option" in
			"-a" | "--all")
				packages="-a"
			;;
			"-c" | "--clean")
				clean=1
			;;
			"-h" | "--help")
				printHelp
			;;
			-j* | --jobs*)
				local jobs
				jobs="${option#-j}"
				jobs="${jobs#--jobs}"
				if [ "$jobs" -ne "$jobs" ] 2> /dev/null; then
					echo "The -j option must be followed" \
						"by a number."
					exit 3
				elif [ "$jobs" -lt 1 ]; then
					echo "The -j option must specify at" \
						"least 1 job."
					exit 3
				else
					semaphoreCreate jobs "$jobs"
				fi
			;;
			"-m" | "--mean")
				mean=1
			;;
			"-n" | "--no-compat")
				compat=
			;;
			"-o" | "--origin")
				origin=1
			;;
			"-q" | "--raw")
				raw=1
				if [ -n "$verbose" ]; then
					echo "The parameters -v and -q may" \
						"not be used at the same time."
					exit 2
				fi
			;;
			"-r" | "--recursive")
				recursive="-r"
			;;
			"-R" | "--upward-recursive")
				Recursive="-R"
			;;
			"-v" | "--verbose")
				verbose=1
				if [ -n "$raw" ]; then
					echo "The parameters -q and -v may" \
						"not be used at the same time."
					exit 2
				fi
			;;
			-? | --*)
				echo "Unknown parameter \"$option\"."
				exit 1
			;;
			-*)
				readParams "${option%${option#-?}}"
				readParams "-${option#-?}"
			;;
			*)
				packages="$packages${packages:+$IFS}$option"
			;;
		esac
	}
}

#
# Display a short help message.
#
printHelp() {
	echo "$name v$version
usage:	$name [-a] [-c] [-h] [-jN] [-m] [-n] [-o] [-q] [-r] [-R] [-v] [packages]"
        exit 0
}

# Create the expression to match to find files linking against compat libraries.
# This can be emptied by readParams to deactivate that feature.
prefix="$(make -f /usr/share/mk/bsd.port.mk -VPREFIX 2> /dev/null || \
	echo '/usr/local')"
compat="=> $prefix/lib/compat|"

# Create the semaphore with CPU cores * 2 jobs.
semaphoreCreate jobs "$(($(sysctl -n hw.ncpu 2> /dev/null || echo 1) * 2))"
# Register the status lock.
lockRegister status

# Read the parameters.
readParams "$@"

statusSet 'Preparing ...'

# Get the packages to work on.
test -z "$packages" && packages="-a"
if [ -n "$pkgng" ]; then
	packages="$(pkg info -q $packages)"
	test -z "$recursive" -a -z "$Recursive" || packages="$packages
	$(pkg info -q $recursive $Recursive "$packages" 2> /dev/null | \
	sed -E 's|^@pkgdep[[:space:]]*||1')"
else
	packages="$(pkg_info -E $packages)"
	test -z "$recursive" -a -z "$Recursive" || packages="$packages
	$(pkg_info -q $recursive $Recursive "$packages" 2> /dev/null | \
	sed -E 's|^@pkgdep[[:space:]]*||1')"
fi

# Create the regexp to match ldd output
match_expr="$compat=> not found|dependency .+ not found"

# The packages to check.
package_amount="$(echo "$packages" | wc -l | sed 's|[[:space:]]||g')"
package_num=0

# Check each selected package.
for package in $packages; {
	package_num="$(($package_num + 1))"
	if [ -n "$pkgng" ]; then
		test $origin \
			&& package_name="$(pkg info -qo "$package")" \
			|| package_name="$package"
	else
		test $origin \
			&& package_name="$(pkg_info -qo "$package")" \
			|| package_name="$package"
	fi

	# Print what we're doing.
	statusSet "Starting job $package_num of $package_amount: $package_name"

	semaphoreUse jobs
	(
		# Remember freeing the semaphore.
		trap 'semaphoreFree jobs' EXIT

		files=""
		if [ -n "$pkgng" ]; then
			files="$(pkg info -lq "$package")"
		else
			files="$(pkg_info -qL "$package")"
		fi
		# Get the programs libraries in case it doesn't use the
		# operating system to find its libraries.
		libraries="$(echo "$files" | grep -E '\.so[\.0-9]*$')"

		outdated=0
		broken=

		# Check each file of each package.
		for file in $files; {
			if [ ! -L "$file" -a \( \
				-x "$file" -o \
				-n "$(echo "$file" | grep -E '\.so[\.0-9]*$')" \
			 \) ]; then
				if dependencyMissing "$file"; then
					if [ -n "$raw" ]; then
						statusPrint "$package_name"
						break 1
					fi
				fi
			fi
		}
	) &
}

semaphoreCountDown jobs "Waiting for %d remaining jobs to finish."
statusSet
lockUnregisterAll

exit 0
Ich erlaube mir das hierher zu stellen, weil die Codeblöcke sich ja selbst einschrumpfen. Es soll nur ein Beispiel sein. Das kannst du lesen und daraus lernen und mit weiteren Scripten geht das ebenso. Ein Script muss nicht die Endung .sh haben, aber manche Editoren erkennen sie daran und färben dann bestimmte Teile so ein, dass sie einfacher zu erkennen sind oder erlauben sogar Testläufe. Grundsätzlich werden scripte über sh(1) aufgerufen und wie fast immer erklärt einem dazu die man-page einiges. Scripte können aber auch durch bestimmte Automatismen aufgerufen werden (zB durch andere Scripte) und müssen dafür dann oft an einem bestimmten Ort gefunden werden und ausführbar sein.
Auch Kommandos wie ls(1) lassen sich in scripten verwenden, aber natürlich sieht ein Script nicht mit Menschen-Augen die Ausgabe des Kommandos. Deshalb sind bunte Ausgaben auch nicht sinnvoll und wenn du wissen möchtest, wieso die Option -G etwas einfärbt, dann müsstest du den Programmierer dieses Tools fragen, wenn du aber wissen möchtest, wie man darauf kommt, solche Optionen zu nutzen, dann ist wieder die Lektüre der man-page hilfreich. Und wenn du nicht weißt, wie "man" geht, hilft auch wieder die man-page, einfach mit "man man" zu erreichen.

man und info -Seiten sind eine großartige Hilfe und ich nutze die dauernd, weil ich mir befehle kaum merken kann. Aber, sich die Funktion eines Betriebssystems oder auch nur die Möglichkeiten von Scripten darüber zu erschließen, hatte mich sehr schnell überfordert. Gute Bücher sind da sicher eher zu empfehlen. Eines, meiner ersten, das nicht mal gut ist, war Linux für Dummies. Das ist immerhin recht dünn und überschaubar. Ansonsten hatte ich damals mit SuSE-Linux angefangen und die lieferten sehr gute Dokumentationen mit. Mehr gelernt habe ich dann aber durch Lektüren im Internet, wobei sich auch immer mehr unbrauchbarer Ballast ansammelt. http://www.selflinux.org/selflinux/ war damals eine Anlaufstelle für Grundverständnis und ich möchte neben unserem eigenen Wiki auch das https://wiki.ubuntuusers.de nennen, wo viele Dinge sehr gut für Erstanwender beschrieben sind.
Die beste Hilfe ist schließlich: versuch es selbst und erkenne deine Irrtümer.
 
Hallo,

ich habe etwas experimentiert aber er macht mir mein Prompt kaputt, der Hostname verschwindet und von 3 Programmen führt er nur 1 aus.

mfg
 
Hallo,

ich habe etwas experimentiert aber er macht mir mein Prompt kaputt, der Hostname verschwindet und von 3 Programmen führt er nur 1 aus.

mfg


ich verstehe da leider nur Bahnhof.
Wer macht dir deinen Prompt kaputt und was meint denn diese Aussage? Ich kann mir darunter überhaupt nichts vorstellen. ~:-> ist mein derzeitiger Prompt, was soll denn daran zerstört werden?
Wo verschwindet der Hostname? Wo war der vorher und wo ist der nachher (wonach auch immer) nicht mehr?
Und was meint das denn, dass ER von drei PROGRAMMEN nur eins ausführt? Der shell-Interpreter? oder was?

Ich verstehe nicht, was du uns da mitteilst. Überhaupt kein bisschen. Aber ich bin auch erklärtermaßen ziemlich dumm.
 
ich habe etwas experimentiert aber er macht mir mein Prompt kaputt, der Hostname verschwindet und von 3 Programmen führt er nur 1 aus.
Google mal nach einem Shell-Howto und mach das.

Du stellst hier Berge von Fragen, vollkommen chaotisch. Thematisch vermischt und mit zu wenig Kontext um vernünftig zu antworten. Deine Fragen machen immer wieder eklatant klar, dass Du Dinge versuchst für die Du noch nicht bereit bist. Fang mal mit Newton an bevor Du Dich in die Quantenphysik stürzt.
 
ich verstehe da leider nur Bahnhof.
Wer macht dir deinen Prompt kaputt und was meint denn diese Aussage? Ich kann mir darunter überhaupt nichts vorstellen. ~:-> ist mein derzeitiger Prompt, was soll denn daran zerstört werden?
Wo verschwindet der Hostname? Wo war der vorher und wo ist der nachher (wonach auch immer) nicht mehr?
Und was meint das denn, dass ER von drei PROGRAMMEN nur eins ausführt? Der shell-Interpreter? oder was?

Ich verstehe nicht, was du uns da mitteilst. Überhaupt kein bisschen. Aber ich bin auch erklärtermaßen ziemlich dumm.

In der Anleitung zu Shell-Skripten steht
# !/etc/sh
Ohne Raute, weil Raute ein Kommentar einleitet.

Wenn ich noch 'chmod +x' ausführe wird die Datei ausführbar.
Ich habe 3 Befehle reingesetzt um mein Wlan eines Tages damit zu starten.

Wenn ich auf dem Prompt nur 'sh' ausführe ist mein Prompt kaputt. Statt 'FreeBsd># steht dann nut '#' da und nix geht mehr. Bei den 3 Programmen steht dann 'no command found'
 
Google mal nach einem Shell-Howto und mach das.

Du stellst hier Berge von Fragen, vollkommen chaotisch. Thematisch vermischt und mit zu wenig Kontext um vernünftig zu antworten. Deine Fragen machen immer wieder eklatant klar, dass Du Dinge versuchst für die Du noch nicht bereit bist. Fang mal mit Newton an bevor Du Dich in die Quantenphysik stürzt.


Mit Screenshots wäre es wesentlich einfacher. Aber ich hänge beim mountroot fest.

Siehste -Bilder sind was schönes:

24596021zp.png
 
Google mal nach einem Shell-Howto und mach das.

Du stellst hier Berge von Fragen, vollkommen chaotisch. Thematisch vermischt und mit zu wenig Kontext um vernünftig zu antworten. Deine Fragen machen immer wieder eklatant klar, dass Du Dinge versuchst für die Du noch nicht bereit bist. Fang mal mit Newton an bevor Du Dich in die Quantenphysik stürzt.

Ich habe gleich den ersten Google-Treffer genommen. Da steht das man die Raute auch hinschreiben muß, ich habe sie gelöscht gehabt. Und in den ersten paar Zeilen steht das die Datei nicht ausführbar sein muß, wenn man den Interpreter voranstellt also 'sh meineDatei' ginge auch. Sehr interessante Sachen stehen da :-))

Danke. Ich hatte nur nach 'Shell skript" gegoogelt.

24596079zu.jpg
 
also, genau. Dann hast du dir diese Fragen selbst beantwortet. Mit einem Befehl, wie sh ruft man eine neue shell auf, die sh heißt. Mit bash zum Beispiel ruft man eine auf,d ie bash heißt. Allerdings: nicht alle shells sind bei FreeBSD im System bereits installiert. Die bash zum Beispiel, die du vermutlich aus GNU/Linux besser kennst, die muss nachträglich installiert werden.

mountroot> ist meiner Ansicht nach kein korrekter User-Login. Es gab da in FreeBSD gelegentliche Wechsel und meines ist schon alt und ich habe lange keines mehr installiert. Aber ich meine, dass sich das System nun so meldet, wenn überhaupt nicht booten kann. Weiter vorher sagte auch Yamagi schon mal was dazu. Dieses System hängt direkt beim Starten, weil es sein Wurzelverzeichnis nicht finden kann. (Ich wiederhole, dass ich etwas spekuliere, weil ich mich an solch einen Fall nicht mehr erinnern kann und das selbst provozieren müsste (was bei meinem älteren System nur sehr beschränkt sinnvoll wäre) oder mich selbst durch das Web suchen müsste). Ich denke, dass dieser Prompt die Anzeige dafür ist, dass du nun eingeben musst, wo sich denn deine root, dein Wurzelverzeichnis des Dateisystems befindet, damit dann erst dieses und in Folge davon Dinge wie /etc /bin und /sbin gemountet werden können. Solltest du für die genannten jeweils extra Partitionen vergeben haben, musst du auch /etc manuell mounten, weil darauf die fstab liegt und darin hast du je vermutlich erst die anderen Partitionen eingetragen.
Naja, das sind alles Dinge, die ich nicht und niemand sonst außer dir wissen kann. Aber die Ausgabe bei diesem mountroot erklärt ja auch, welche Geräte erkannt wurden und die dir nun für eine Auswahl deines "/" angeboten werden. Davon ist hoffentlich eines korrekt, das du auswählen kannst und dann weiter booten.
Wieso überhaupt das System so installiert ist, dass es nicht mehr weiß, wo sein "/" liegt, ist eine andere Frage. Da läuft offenbar etwas schief mit deiner Installation. Da müsste man nochmal genauer nachsehen.
 
http://wiki.bsdforen.de/howto:shell-scripting

das wurde zuvor schon erwähnt, ich stelle dir das hier mal ausführlich nochmal her. Es gibt viele Informationen im Netz zum Thema Script und bei einer Quelle wirst du nicht verweilen (können). Kamikaze, der u.a. das Script aus meinem Beispiel von oben geschrieben hatte, gibt in unserem Wiki eine sehr klare und kurz gehaltene Einführung, die meiner Ansicht nach wesentliches sehr viel deutlicher macht, als manch andere Lektüre. Allerdings stochere ich selbst mir meine Scripte auch immer irgendwie gerade so zusammen und bin wie mit allen Unux-Themen unbeholfen und unbedarft.

Die Seiten im Ubuntu-Wiki finde ich generell sehr hilfreich und ganz gut beschrieben, es fehlt ihnen aber oft die Aufklärung über mögliche Hintergründe und Zusammenhänge, die erst eine eigene Entscheidung begründen können. Das ist ein generelles Urteil, das sich aus meiner Zeit in den letzten Wochen bei Ubuntu ergeben hat. Die von dir gezeigte Seite (dazu hätte dann auch ein Link genügt),kenne ich nicht, warne aber vorsorglich davor, alles einfach zu übernehmen. Dort wird die bash behandelt und die bash verhält sich manchmal eigenartig aus unserer Sicht. Vielen Nutzern wird das nicht weiter auffallen, aber ich hatte mir für meine Zeit in Ubuntu nicht die bash ausgesucht und blieb lieber bei meiner gewohnten csh. Du kannst das natürlich ändern, solltest aber wissen, das unter FreeBSD die bash in /usr/local/bin/bash zu finden ist und das kann bedeuten, vor allem, wenn du sie als Vorzugs-shell für deinen Super-User setzt, dass sie in solchen Szenarien wie deinem mountroot>, wo keine System-Partitionen eingebunden werden, auch nicht gefunden wird. Nicht gefunden bedeutet dann, dass da auch kein Fallback existiert, du bleibst dann ohne shell und das bedeutet, ziemlich verloren und einsam auf deinem System. Hast du eh nur eine einzige Partition benutzt, relativiert sich das natürlich.

Aber bevor du weiter in Scripten machst, solltest du deine Installation in Ordnung bringen und dein installiertes System erst mal booten.
 
Was pit234a mit dem letzten Satz sagen wollte und was auch ich empfehle: Installier das System nochmal neu. Du hast da was zerschossen.
Da Du offenbar blutiger Anfänger bist, wäre vielleicht ein fertig konfiguriertes FreeBSD eine gute Wahl. Das gibt es unter dem Namen PC-BSD, mit einem fertig aufgesetztem grafischen Desktop namens Lumina. Da kannst Du dann sofort richtig loslegen.
Unabhängig davon ist ein kleiner Einstieg in die Shell ein absolutes Muß, und mit dem Ubuntu-Wiki bist Du ganz gut bedient. Allerdings ist die Standard-Shell in FreeBSD nicht die Bash, sondern die Tcsh. Entsprechend sollten z. B. Deine Skripte mit der Zeile »#!/bin/tcsh« beginnen (oder Du stellst die Standard-Shell um), und gewisse nicht-triviale Befehle lauten dann auch ein bißchen anders, aber darüber mußt Du Dir jetzt nicht gleich den Kopf zerbrechen.
Auf Anfängerniveau unterscheidet sich FreeBSD nur wenig von Linux, außer daß teils andere Programme Verwendung finden, z. B. der erwähnte Lumina-Desktop, anstelle dessen Du aber auch KDE usw. verwenden kannst.

Viel Spaß, und vergiß neben den Ubuntu-Wikis nicht, immer wieder ins FreeBSDsche Handbuch zu schauen. Nicht zum thema Shell, aber ganz allgemein.
 
Hallo pit234a,

er zeigt ja nur den mountroot an, wenn ich mit QEMU boote.Wenn ich ganz normal mit BIOS boote gehts.

Und so wie Du es geschrieben hast ist es auch, er findet da die Partition nicht.
Aber mein wlan geht jetzt endlich. Über QEMU zu booten ist jetzt nicht mehr wichtig.
 
Was pit234a mit dem letzten Satz sagen wollte und was auch ich empfehle: Installier das System nochmal neu. Du hast da was zerschossen.
Da Du offenbar blutiger Anfänger bist, wäre vielleicht ein fertig konfiguriertes FreeBSD eine gute Wahl. Das gibt es unter dem Namen PC-BSD, mit einem fertig aufgesetztem grafischen Desktop namens Lumina. Da kannst Du dann sofort richtig loslegen.
Unabhängig davon ist ein kleiner Einstieg in die Shell ein absolutes Muß, und mit dem Ubuntu-Wiki bist Du ganz gut bedient. Allerdings ist die Standard-Shell in FreeBSD nicht die Bash, sondern die Tcsh. Entsprechend sollten z. B. Deine Skripte mit der Zeile »#!/bin/tcsh« beginnen (oder Du stellst die Standard-Shell um), und gewisse nicht-triviale Befehle lauten dann auch ein bißchen anders, aber darüber mußt Du Dir jetzt nicht gleich den Kopf zerbrechen.
Auf Anfängerniveau unterscheidet sich FreeBSD nur wenig von Linux, außer daß teils andere Programme Verwendung finden, z. B. der erwähnte Lumina-Desktop, anstelle dessen Du aber auch KDE usw. verwenden kannst.

Viel Spaß, und vergiß neben den Ubuntu-Wikis nicht, immer wieder ins FreeBSDsche Handbuch zu schauen. Nicht zum thema Shell, aber ganz allgemein.


Hallo,

ich habe nur den mountroot, weil ich mit QEMU boote. Ich wollte in Linux FreeBSD booten umeinige Dateien zu kniosen. Mein wlan lief nicht.

Der Stick bootet, nur eben nicht mit dem QEMU-Launcher in Debian.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben