GNU/Linux >> Znalost Linux >  >> Ubuntu

Proč tento skript k odstranění části historie příkazů nefunguje v počítači?

Skript najdete zde:https://stackoverflow.com/questions/14750650/how-to-delete-history-of-last-10-commands-in-shell

Pro usnadnění zde je:

for x in `seq $1 $2`
do
  history -d $1
done

Vložil jsem to do svého adresáře include (ten, který jsem přidal do PATH), kde spouštím mnoho dalších skriptů, které jsem napsal, a fungují dobře.

To nevede k požadovanému výsledku odstranění řádků z mé historie, ve skutečnosti to nedělá vůbec nic.

Máte představu, proč příkaz historie nefunguje? Zajímalo by mě, jestli to má něco společného s adresáři.

Další informace:

Hrál jsem si s kódem a zkoušel různé varianty. Pokud vložím echo před history a spusťte jej, dostanu následující výstup:

[email protected]:~$ idelhistory 300 305
history -d 300
history -d 301
history -d 302
history -d 303
history -d 304
history -d 305
[email protected]:~$ 

Takže se mi zdá, že by to mělo fungovat perfektně. nemohu přijít na to proč. Tento skript se spouští z /$HOME/Scripts/ a byl zahrnut do PATH. Zkoušel jsem to také spustit pomocí sudo a nic se nezměnilo.

Přijatá odpověď:

Jednou větou:nefunguje to, protože to nevoláte správně.

Za prvé, protože váš skript nezačíná #!/bin/bash , ve skutečnosti to není bash skript. Který shell je spuštěn, závisí na tom, jak jej vyvoláte. Když jej vyvoláte z příkazového řádku bash, bash rozvětví novou instanci sebe sama (to se stejně musí stát, aby bylo možné provést jakýkoli externí příkaz) a je to tato nová instance, která spustí skript. Skript se tedy spustí se stejným nastavením (včetně dosavadní historie) jako nadřazený shell. Provádí se s různými možnostmi; konkrétně je u příkazů ve skriptu vypnuto sledování historie (což vám vyhovuje, protože jinak by to přidalo do historie, kterou chcete upravit).

Zda instance bash spouštějící skript má HISTFILE proměnná sada závisí na tom, zda byla exportována v nadřazeném prvku (což je trochu divné). Pokud není exportován, a tedy nastaven v podřízeném prvku, potom podřízený skript po skončení upravenou historii neuloží.

Pokud HISTFILE je exportován, potom podřízený skript upraví váš soubor historie. Pokud jste však svůj interaktivní shell nenakonfigurovali tak, aby znovu načítal historii po každém příkazu, upravenou historii převezmou pouze nově spuštěné instance bash.

Související:Dual boot w/ UEFI a LUKS – Co potřebuji vědět/dělat?

Pokud chcete spustit fragment shellu, který ovlivňuje aktuální instanci shellu, musíte tento shell spustit v aktuální instanci shellu, místo abyste jej spouštěli jako podproces . Na podobný problém byste narazili, pokud byste chtěli dělat další věci, které ovlivňují samotný proces shellu, jako je změna adresářů, nastavení proměnných atd. Použijte . (“tečka”) nebo source vestavěný ke spuštění skriptu v aktuálním procesu shellu.

. idelhistory 300 365

Případně to můžete definovat jako funkci ve vašem .bashrc .


Ubuntu
  1. Rozumíte vykřičníku (!) v Bash?

  2. Proč následující příkaz zabíjí systém?

  3. Zdá se, že v historii příkazů chybí prvních 75 řádků?

  1. Proč není Oracle Java součástí standardního úložiště Ubuntu?

  2. Proč se nativní rozlišení monitoru nezobrazuje jako možnost?

  3. Příkaz historie zobrazující adresář a datum?

  1. Jak používat příkaz historie v Linuxu

  2. Zobrazení a smazání historie terminálu v Ubuntu 20.04 – nejlepší metoda?

  3. Při vytváření prvního skriptu Bash nelze příkaz Cd „přilepit“?