Błędnie zmodyfikowany `/ bin / sh '

16

Miałem ten skrypt:

spd-say "Hello, don't forget the trash bin."

Przypomniało mi to, co powinienem zrobić, i przeniosłem to, /usr/local/bin/a polecenie trashwypowiedziało argument, a potem ustawiłem zadanie crontab , aby codziennie przypominało mi, co chcę zrobić. Ale crontab nie działał i nie mogłem zrozumieć, dlaczego (wykonuje inne prace bezbłędnie).

Gdy zobaczyłem ten komunikat w moim terminalu:

You have new mail in /var/mail/root

na końcu którego ten wiersz popełnił poważny błąd:

/bin/sh: 1: trash: not found

Wiem, że to było głupie, ale zrobiłem:

mv /usr/local/bin/trash /bin/sh

myśląc, że shjest to katalog i powinienem tam przenieść skrypt, aby go wykonać.

Teraz, gdy chcę zobaczyć stronę podręcznika system mówi:

„Witaj, nie zapomnij o koszu na śmieci”.

A wynikiem cat shjest:

#!/bin/bash
spd-say "Hello, don't forget the trash bin. "

W każdym razie, czy mogę coś zrobić lub muszę ponownie zainstalować system operacyjny?

Codito ergo sum
źródło
2
Spekuluję, ale zadania crona działają w bardzo ograniczonym środowisku, w tym $ PATH z kilkoma katalogami. Być może dlatego działa z terminala, ale nie przez crona. (W rzeczywistości, gdy coś działa z normalnego terminala, ale nie przez crona, to pierwszą rzeczą, którą sprawdzam.)
CV z
1
@ a CVn; Nie wiem na czym polega problem, ale kiedy zastąpię spd-say przez echo i ustawię zadanie crontab: trash> ~ / Desktop / trash.txt **, działa i plik jest tworzony na moim pulpicie. Myślę, że powinienem o to zapytać w innym pytaniu.
Codito ergo sum
Tak, jeśli chcesz o to zapytać, zadaj je jako osobne pytanie.
CVn
„Teraz, gdy chcę zobaczyć stronę podręcznika system mówi:„ Cześć, nie zapomnij o koszu ”.„ Mówiąc man
szczerze
8
@LogicalBranch Nie zgadzam się; Kocham ich; są potężnymi przewodnikami off-line.
Codito ergo sum

Odpowiedzi:

30

W systemach Ubuntu domyślnie /bin/shjest dowiązaniem symbolicznym do dashpowłoki:

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Jul  7  2018 /bin/sh -> dash

Tak więc (zakładając, że emulator terminala używa powłoki bash i nie został uszkodzony przez swój błąd), wystarczy odtworzyć link:

sudo ln -sf dash /bin/sh
steeldriver
źródło
14
OP: mv /usr/local/bin/trash /bin/sh ,sh: Nie mogłeś żyć z własną porażką, dokąd to cię zaprowadziło? Wróć do mnie.
LogicalBranch
2
@LogicalBranch, w jaki sposób masz tylko 1 głos za to arcydzieło?
vikarjramun
4
@vikarjramun to brzmi jak arcydzieło, ale po prostu nie rozumiem tego ...
Nacht - Przywróć Monikę
@Nacht pochodzi od Avengers: Endgame; linia od czarnego charakteru, Thanos.
Cullub
@Cullub Oooooh ..... dzięki ... jestem prawie pewien, że teraz to dostaję ...
Nacht - Przywróć Monikę
7

Nie, nie musisz ponownie instalować systemu. / bin / sh to tylko softlink do twojej powłoki. readlink -f /bin/sh /bin/bashW moim przypadku bash. Przenieś skrypt i utwórz softlink do swojej ulubionej powłoki.

nikt
źródło
10
/ bin / sh powinien właściwie wskazywać na / bin / dash. Jeśli chcesz zmienić powłokę systemową, użyj sudo dpkg-reconfigure dash, jak zrobić / bin / sh point na / bin / bash? . Pamiętaj również, że powłoka systemowa nie jest domyślną powłoką interaktywną.
wjandrea