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.
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
.