interaktive shell in einen shell script emulieren?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
frodo
Beiträge: 342
Registriert: 08.06.2007 09:16:15
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Burnley
Kontaktdaten:

interaktive shell in einen shell script emulieren?

Beitrag von frodo » 05.03.2021 09:01:56

Hallo Leute,

ich bin schon ziemlich lange mit Linux unterwegs, haber in der Vergangenheit mit der shell ( bash ) eher nur allgemeine sagen gemacht. Von daher brauche ich etwas hilfe. Nur mal angenommen ich habe ein Skript das am Ende ein

Code: Alles auswählen

source $HOME/.profile
ausfuehren soll.

Beispiel:

Code: Alles auswählen

#!bin/bash
.......

SPATH="$HOME/.scripts/bin"
echo "export PATH=$PATH:$SPATH"

source $HOME/.profile
Natuerlich koennte ich in der $HOME/.bashrc

Code: Alles auswählen

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
abschalten aber man will ja was lernen. Von daher wuesste ich gerne wie in diesen Beispiel eine emulierung einer interaktiven Shell aussehen wuerde das source $HOME/.profile funktioniert.

Vielen Dank
VDR: MSI C847MS-E33 onboard. Intel® Celeron® 847 | GT520 | VDR 2.1.6 | Stable | Kernel 3.15.7
Notebook: Lenovo G530 | Wheezy| icewm | Kernel 3.2.0-4-686

Benutzeravatar
smutbert
Moderator
Beiträge: 8318
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: interaktive shell in einen shell script emulieren?

Beitrag von smutbert » 05.03.2021 12:10:34

Bin mir nicht ganz sicher, was du willst, aber »~/.profile« hat nichts mit interaktiv oder nicht zu tun. »~/.profile« wird bei login-Shells berücksichtigt, auch wenn sie nicht-interaktiv sind.

Die »~/.bashrc« wird umgekehrt erst einmal nur bei nicht-Login-Shells ausgewertet.

Allerdings steht in der »~/.profile« von Debian nomalerweise ein Absatz, der die »~/.bashrc« auch in login-Shells einliest und in der »~/.bashrc« die von dir gepostete Abfrage, die die »~/.bashrc« verlässt, wenn die Shell nicht-interaktiv ist. Bei Debian bedeutet das im Endeffekt, dass
  • »~/.profile« für login-Shells
  • »~/.bashrc« für interaktive Shells
gilt.
Wenn du die »~/.profile« für eigene Skripte eingelesen haben willst, könntest du etwa

Code: Alles auswählen

#!/bin/bash -l 
als Shebang nehmen, damit ein Skript von einer login-Shell ausgeführt wird.

Wenn du tatsächlich zwischen interkativ und nicht-interaktiv unterscheiden willst, unabhängig davon, ob es sich um eine Login-Shell handelt, musst das wohl selbst machen.

Antworten