Dela med dig av dina egna script/*sh-tips

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Dela med dig av dina egna script/*sh-tips

Inlägg av dmz »

Allright. Jag trodde att eftersom >> appendar så skapar den heller ingen fil om målfilen inte existerar. Antar att det står någon notis om detta i dokumentationen dock.
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Harlekin33
Inlägg: 4164
Blev medlem: 19 jan 2008, 13:52
OS: Debian

Re: Dela med dig av dina egna script/*sh-tips

Inlägg av Harlekin33 »

Detta är inte mitt eget men..

http://pin.ic.cz/Water.lua
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Dela med dig av dina egna script/*sh-tips

Inlägg av dmz »

Harlekin33 skrev:Detta är inte mitt eget men..

http://pin.ic.cz/Water.lua
Du får gärna tala om vad det är bra för också. :P
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Harlekin33
Inlägg: 4164
Blev medlem: 19 jan 2008, 13:52
OS: Debian

Re: Dela med dig av dina egna script/*sh-tips

Inlägg av Harlekin33 »

dmz skrev:
Harlekin33 skrev:Detta är inte mitt eget men..

http://pin.ic.cz/Water.lua
Du får gärna tala om vad det är bra för också. :P
Det har med OpenGL shaders att göra..

Hitta det här:

http://www.youtube.com/watch?v=u9qVPpeK ... re=related

Kolla i övre högra hörnet..(i boxen alltså)
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Dela med dig av dina egna script/*sh-tips

Inlägg av Konservburk »

dmz skrev:Allright. Jag trodde att eftersom >> appendar så skapar den heller ingen fil om målfilen inte existerar. Antar att det står någon notis om detta i dokumentationen dock.
sh-manualblad från tidigt 70-tal:

Kod: Markera allt

        An  argument  of the form ">>arg" causes file "arg" to be
        used as the standard output for the  given  command.   If
        "arg"  did not exist, it is created; if it did exist, the
        command output is appended to the file.
man zshmisc:

Kod: Markera allt

       >> word
              Open  file  word  for writing in append mode as standard output.
              If the file does not exist, and the  CLOBBER  option  is  unset,
              this causes an error; otherwise, the file is created.

       >>| word
       >>! word
              Same  as  >>,  except  that  the  file is created if it does not
              exist, even if CLOBBER is unset.
Du kan tydligen använda >>| eller >>! om du vill att det ska fungera oavsett vilken CLOBBER-inställning du har. Men var medveten om att det är väldigt zsh-specifikt.
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Dela med dig av dina egna script/*sh-tips

Inlägg av dmz »

Tack!
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Användarvisningsbild
bbauto
Inlägg: 1594
Blev medlem: 11 dec 2006, 17:58
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Bromölla

Re: Dela med dig av dina egna script/*sh-tips

Inlägg av bbauto »

Ett litet Nautilus script:

Kod: Markera allt

#!/bin/bash
#Nautilus script Rename with prefixsuffix

base="`echo $NAUTILUS_SCRIPT_CURRENT_URI | cut -d'/' -f3- | sed 's/%20/ /g'`"
if [ -z "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" ]; then
     dir="$base"
else 
     while [ ! -z "$1" -a ! -d "$base/$1" ]; do shift; done
     dir="$base/$1"
fi

if test -f "$dir/.rename_tmp/.exists"
   then
      echo "Exists!"
   else
      mkdir "$dir/.rename_tmp"
      touch "$dir/.rename_tmp/.exists"
fi

IFS='
'
for file in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do
	if [ -f "$file" ]; then
		cp $file "$dir/.rename_tmp/"
	fi
done 

cd "$dir/.rename_tmp"
prefixsuffix $@

for file in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do
	if [ -f "$file" ]; then
		rm $file
	fi
done

mvfiles="$dir/.rename_tmp/*"
mv $mvfiles "$dir/"
rm "$dir/.rename_tmp/.exists"
rmdir "$dir/.rename_tmp"
Installera prefixsuffix från förråden...

PS! Sökvägen uppdateras inte som den ska förs man väljer Folder path: Choose->Select

prefixsuffix har visat sig ha sina begränsningar, så gjort en liknande för pyrenamer...
PyRenamer:

Kod: Markera allt

#!/bin/bash
#Nautilus script Rename with pyrenamer

base="`echo $NAUTILUS_SCRIPT_CURRENT_URI | cut -d'/' -f3- | sed 's/%20/ /g'`"
if [ -z "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" ]; then
     dir="$base"
else 
     while [ ! -z "$1" -a ! -d "$base/$1" ]; do shift; done
     dir="$base/$1"
fi

if test -f "$dir/.rename_tmp/.exists"
   then
      echo "Exists!"
   else
      mkdir "$dir/.rename_tmp"
      touch "$dir/.rename_tmp/.exists"
fi

IFS='
'
for file in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do
	if [ -f "$file" ]; then
		cp $file "$dir/.rename_tmp/"
	fi
done 

pydir="$dir.rename_tmp"
pyrenamer -r "$pydir"

for file in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do
	if [ -f "$file" ]; then
		rm $file
	fi
done

mvfiles="$dir/.rename_tmp/*"
mv $mvfiles "$dir/"
rm "$dir/.rename_tmp/.exists"
rmdir "$dir/.rename_tmp"
Senast redigerad av 2 bbauto, redigerad totalt 31 gång.
Användarvisningsbild
bbauto
Inlägg: 1594
Blev medlem: 11 dec 2006, 17:58
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Bromölla

Re: Dela med dig av dina egna script/*sh-tips

Inlägg av bbauto »

Ytterligare Nautilus script (ChgOwner):

Kod: Markera allt

#!/bin/sh
# Change Owner and Group to Read & Write recursively from current dir.
# Replace root:admin if you wish (NewOwner:NewGroup)

base=”`echo $NAUTILUS_SCRIPT_CURRENT_URI | cut -d’/’ -f3- | sed ’s/%20/ /g’`”
if [ -z "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" ]; then
   dir=”$base”
else
while [ ! -z "$1" -a ! -d "$base/$1" ]; do shift; done
   dir=”$base/$1″
fi

cd "$dir"
foo=`gksudo -u root -k -m "enter your password for nautilus root access" /bin/echo "got r00t?"`
sudo chown --recursive root:admin ./
foo=`gksudo -u root -k -m "enter your password for nautilus root access" /bin/echo "got r00t?"`
sudo chmod --recursive 770 ./
Användarvisningsbild
bbauto
Inlägg: 1594
Blev medlem: 11 dec 2006, 17:58
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Bromölla

Re: Dela med dig av dina egna script/*sh-tips

Inlägg av bbauto »

Jag jobbar mycket med Postscript utskrifter från olika CAD-program, oftast till ett spooler directory... sen kopierar jag alla *.PS -> Projektnamn.PS
och avslutar sedan med denna script, för att slutligen göra hela ritningssatser till PDF-format.

Kod: Markera allt

#!/bin/bash
#created by bbauto
IFS='
'
for file in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do
	if [ -f "$file" ]; then
		base=${file%.*}
		newname=${base}.pdf
		ps2pdf $file $newname
		cp $newname /home/bengtb/Skrivbord/PS-PDF
#		rm $newname
		rm $file
	fi
done 
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Dela med dig av dina egna script/*sh-tips

Inlägg av dmz »

clftail
Tailer för Common Log Format (apache, lighttpd osv) som gör det lite lättare att se vad som försigår på webservern, i realtid.

Kod: Markera allt

#!/usr/bin/perl 
use strict;
use File::Tail;

my $log   = shift;
my $line  = "";
my $tail  = File::Tail->new(name=>$log,
                            maxinterval=>3,
                            adjustafter=>3,
                            interval=>0,
                            tail=>100
                            );
while(defined($line=$tail->read)) {
  my $e = "(.+?)";
  $line =~ /^$e $e $e \[$e:$e $e\] "$e $e $e" $e $e/;

  my $ip      = $1;
  my $ref     = $2;
  my $name    = $3;
  my $date    = $4;
  my $time    = $5;
  my $gmt     = $6;
  my $request = $7;
  my $file    = $8;
  my $ptcl    = $9;
  my $code    = $10;
  my $size    = $11;

  $code = "\033[38;5;240m$code\033[0m" if $code == 404;
  $code = "\033[38;5;155m$code\033[0m" if $code == 200;
  $code = "\033[38;5;160m$code\033[0m" if $code == 501;
  $code = "\033[38;5;208m$code\033[0m" if $code == 301;
  $code = "\033[38;5;124m$code\033[0m" if $code == 403;
  $code = "\033[38;5;113m$code\033[0m" if $code == 304;
  $file = "" if $file =~ /^\/$/;
  $file = "\033[38;5;160m$file\033[0m" if $file !~ /([A-Za-z0-9])+/;
  $size = "\033[38;5;160m$size\033[0m" if $size > 5;
  printf("%s %7s %s %s %60s\n",
  $code, $request, $size, $ip, $file);
}
mail
Det var aningens lurigt att lista ut hur msmtp ville att man skulle specificera mottagare, subject och body, så jag skrev en wrapper runt det för att slippa glömma bort någon mer gång.

Kod: Markera allt

#!/usr/bin/perl
use strict;
#mail
use Getopt::Long;

&interactive if !@ARGV;
our $opt_stdin;
GetOptions(stdin  =>  \$opt_stdin);

my @details = @ARGV;
my $acc = "gmail";
my $def_Rec = "trapd00r\@trapd00r.se";


&readStdin if $opt_stdin;

sub readStdin {
  my @body;
  while(<>) {
    push(@body, $_);
  }
  my $body = join/\n/, @body;
  my $rec  = $def_Rec;
  my $subject = 'stdin';
  my $content = sprintf("Subject:$subject\n\n$body\n");
  system("printf \"$content\"|msmtp -a $acc \"$def_Rec\"");
  print "Status: $?\n";
  exit 0;
}
  
sub mail {
  my ($subject, $body, $rec) = @_;
  $rec = "foo\@bar.com" unless $rec;
  my $content = sprintf("Subject:$subject\n\n$body\n");
  system("printf \"$content\"|msmtp -a $acc \"$rec\"");
  print "Status: $?\n";
}
&mail(@details);

sub interactive {
  print "Subject: ";
  my $subject = <STDIN>;
  print "Body: ";
  my $body    = <STDIN>;
  print "Mail: ";
  my $rec     = <STDIN>;
  chomp($subject,$body,$rec);
  my $content = sprintf("Subject:$subject\n$body\n");
  system("printf \"$content\"|msmtp -a $acc \"$rec\"");
  print "Status: $?\n";
}
unpack
Packar upp film till /mnt/$disk/.temp, spelar den och tar bort den uppackade filmen efteråt. Håller reda på vilka filmer som är sedda.

Kod: Markera allt

#!/bin/sh
# unpack script
chmod 777 $(pwd)
find . -iname '*.rar' -execdir rar x {} $(pwd | perl -pe 's/^((?:\/[^\/]+){2}\/).*/$1/').temp/ \;
mplayer -slave -input file=/home/scp1/.mplayer/fifo $(pwd | perl -pe 's/^((?:\/[^\/]+){2}\/).*/$1/').temp/* && rm $(pwd | perl -pe 's/^((?:\/[^\/]+){2}\/).*/$1/').temp/*
# keep track of what I've seen
echo $(basename $(pwd)) >> /mnt/Movies_1/.seen
Bara ett proof of concept; Jag upptäckte nyss att man kan styra mplayer genom FIFOs. Otroligt användbart.

Kod: Markera allt

#!/usr/bin/perl
use strict;
my $fifo = "/home/scp1/.mplayer/fifo";
my %commands = ('fs'    =>  'vo_fullscreen',
                'stop'  =>  'stop',
                'pause' =>  'pause',
                'soff'  =>  'mute 1',
                'son'   =>  'mute 0',
                'fstep' =>  'frame_step',
                'osd'   =>  'osd',
               );

if(!@ARGV) {
  foreach my $choice(sort(keys(%commands))) {
    printf("%6s %s\n", $choice, $commands{$choice});
  }
}

my $cmd = shift;
&talk($commands{$cmd});

sub talk {
  my $cmd = shift;
  open(FIFO,'>',$fifo) or die $!;
  print FIFO $cmd, "\n";
  close(FIFO);
}
mpdmon-full
Monitor för mpd med history, när sång byts så notifieras vi.

Kod: Markera allt

#!/usr/bin/perl 
use strict;
use Audio::MPD;
use List::Util qw(shuffle);
my $mpd = Audio::MPD->new;

sub monitor {
  my $np = "";
  my @c;
  for(my $i=0;$i<256;$i++) {
    push(@c, "\033[38;5;$i"."m");
  }
  while(1) {
    my $current = $mpd->current;
    my $output = $mpd->current->file;
    if(!$current) {
      $current = $c[1].'undef'.$c[0];
      $output = $current;
    }
    my $time1 = $mpd->status->time->sofar;
    my $time2 = $mpd->status->time->total;
    my @date  = localtime(time);

    if("$np" ne "$current") {
      $np = $current;
      my @rc = shuffle(@c);
      printf("%02s:%02s:%02s▕ $rc[0]%s$c[0]\n",
              $date[2], $date[0], $date[1], $output);
    }
    sleep 2;
  }
}

&monitor;
mpdmon-rt
Samma sak här, men vi uppdaterar en och samma rad hela tiden, vilket gör det perfekt för conky, dzen, hardstatus i screen eller liknande.

Kod: Markera allt

#!/usr/bin/perl
use strict;
use Audio::MPD;
my $mpd = Audio::MPD->new;

sub monitor {
  my $np = "";
  while(1) {
    my $current = $mpd->current;
    my $output;
    if(!$current) {
      $output = 'undef';
      $current = 'undef';
    }
    else {
      $output = $mpd->current->artist . ' - ' . 
                $mpd->current->album  . ' - ' .
                $mpd->current->title;
    }
    my $time1 = $mpd->status->time->sofar;
    my $time2 = $mpd->status->time->total;
    
    $| = 1;
    printf(" [%s/%s]\r", $time1, $time2);
    if("$np" ne "$current") {
      $np = $current;
      printf("\t\t%s\r", $output);
    }
    sleep 1;
  }
}

&monitor;
colortest-256-ng
Inspirerad av http://www.vim.org/scripts/script.php?script_id=1349 så tänkte jag att jag kunde göra det lite snyggare. Helt otroligt att han verkar ha suttit och skrivit alla escapesekvenser för hand.

Kod: Markera allt

#!/usr/bin/perl
# colortest-256-ng 
# prints table of available colors for terminals supporting 256 colors
# optionally takes arbitary input and colors it randomly
use strict;
use Getopt::Long;
use List::Util qw(shuffle);

my %colors;
for(my $i=0;$i<256;$i++) {
  $i = sprintf("%03s", $i);
  my $escaped_escape = "\\033[38;5;$i".'m';
  $colors{$escaped_escape} = "\033[38;5;$i".'m';
}

if(!@ARGV) {
  foreach my $str(sort(keys(%colors))) {
    print "$str $colors{$str}\n";
  }
  print "\033[0m\n";
  print << "USAGE";

 USAGE: $0 [-c <cmd>]

  EXAMPLES
    ls|./$0 -c
    ./$0 -c file
    dmesg|./$0

USAGE
exit 0;
}

GetOptions('cmd'   =>  \&cmd,
         );

sub cmd {
  while(<>) {
    my @colors = values %colors;
    @colors = shuffle(@colors);
    my @seen;
    my $i = 0;
    push(@seen, $colors[$i]);
    if($colors[0] ~~ @seen) {
      $i++;
      print $colors[0], $_;
    }
  }
}
Slutligen så tyckte jag att http://en.wikipedia.org/wiki/Collatz_conjecture var intressant, så jag löste den;

Kod: Markera allt

#!/usr/bin/perl
$i=shift;while($i>1){if($i%2==0){$i=$i/2;}else{$i=$i*3+1;}print"$i\n";}
Senast redigerad av 1 dmz, redigerad totalt 10 gånger.
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Användarvisningsbild
SlamsornasKung
Inlägg: 886
Blev medlem: 27 jun 2009, 19:23
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: 08

Re: Dela med dig av dina bästa shell-tips

Inlägg av SlamsornasKung »

David Andersson skrev:Se de nyaste/senast ändrade filerna i aktuell katalog:

Kod: Markera allt

ls -Altr
Hej!

Hundra år försent, men i alla fall...

Koden ovan är faktiskt lite felaktig. Den sorterar ”reversed”, med andra ord hamnar de SENAST ändrade filerna SIST, det är väl snarare så att du vill se de senast ändrade filerna FÖRST.

Om du istället kör:

ls -Alt eller föralldel bara ls -lt så visas de senast ändrade filerna FÖRST (överst) i listan. Personligen lägger jag dessutom till | head -10 så att jag ser de tio senast ändrade filerna, alltså:

Kod: Markera allt

ls -lt | head -10
Tjing!

PS. Vad tycks Obi-Wan ;-) DS.

SK
HP NC2400 - Ubuntu 10.04 • Fujitsu Siemens AmiloM7400 - Arch Linux • HP/Compaq Mini 110C - Ubuntu 10.04
CryingFreeman skrev:[…] Ubuntu är och förblir en meritokrati, inget demokratiskt experiment där alla får säga vad som helst till vem som helst, hur som helst.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Dela med dig av dina bästa shell-tips

Inlägg av Konservburk »

SlamsornasKung skrev:Koden ovan är faktiskt lite felaktig. Den sorterar ”reversed”, med andra ord hamnar de SENAST ändrade filerna SIST, det är väl snarare så att du vill se de senast ändrade filerna FÖRST.
Det är nog meningen ska du se. På det kan man enkelt och snabbt se de senast ändrade filerna direkt utan att behöva scrolla upp en massa och man slipper dessutom pipe:a vidare till less eller more eller för den delen head.
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Dela med dig av dina bästa shell-tips

Inlägg av Osprey »

Konservburk skrev:
SlamsornasKung skrev:Koden ovan är faktiskt lite felaktig. Den sorterar ”reversed”, med andra ord hamnar de SENAST ändrade filerna SIST, det är väl snarare så att du vill se de senast ändrade filerna FÖRST.
Det är nog meningen ska du se. På det kan man enkelt och snabbt se de senast ändrade filerna direkt utan att behöva scrolla upp en massa och man slipper dessutom pipe:a vidare till less eller more eller för den delen head.
Tror också att det är meningen, jag använder ofta "-ltr" själv och r:et just för att då slipper jag att scrolla för att hitta senaste filen och den hamnar närmast prompten, där jag ändå har blicken fäst så att säga...
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Dela med dig av dina bästa shell-tips

Inlägg av dmz »

SlamsornasKung skrev:

Personligen lägger jag dessutom till | head -10
Du kan skippa -10, det är default. :)
Värt att notera är att -r till ls fungerar på i princip allting, mycket smidigt.
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Harlekin33
Inlägg: 4164
Blev medlem: 19 jan 2008, 13:52
OS: Debian

Re: Dela med dig av dina egna script/*sh-tips

Inlägg av Harlekin33 »

BRA jobbat där dmz, så ska det se ut!

:D
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Dela med dig av dina bästa shell-tips

Inlägg av Konservburk »

dmz skrev:Värt att notera är att -r till ls fungerar på i princip allting, mycket smidigt.
Undantaget är väl -U då, men just den kombinationen är ju ändå inte vettig.
Användarvisningsbild
BadOmen
Inlägg: 1172
Blev medlem: 18 aug 2006, 10:45
OS: Kubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Umeå

Re: Dela med dig av dina egna script/*sh-tips

Inlägg av BadOmen »

Här kommer ett litet Nautilus script som gör att man kan skapa en kopia av en fil i samma mapp som man befinner sig i, man får möjligheten att döpa den till vad man vill.

Kod: Markera allt

#!/bin/bash

# This script makes it easy to make a duplicate of a file in the same directory.
# It lets you choose a name for the new file and then it makes the copy with the new name.

# $1 Is the selected file				

if [[ -f "$1" ]]; then # True if FILE exists and is a regular file.
	selectedFile="$1"
	backupname=$(zenity --text="Skriv in backup namnet för filen." --entry-text="$selectedFile" --entry)

	
	if [[ $? == 0 ]]; then # True if previos command exicutet correctly.
		
		if [[ -n "$backupname" ]]; then # True if the length of "STRING" is non-zero.

			if [[ -a "$backupname" ]]; then # True if FILE exists.
	
				if zenity --question --ok-label=JA --cancel-label=NEJ --text="Filen $backupname finns redan, vill du skriva över den?"; then
					if [[ -w "$backupname" ]]; then # True if FILE exists and is writable.
						cp "$1" "$backupname" 	
						if [[ $? == 0 ]] ; then # True if previos command exicutet correctly.
							zenity --info --text "Backupen är nu klar, filen $backupname har skapats."
						else
						zenity --info --text "Backupen misslyckades, kanske har du inte skrivrättigheter här"
						fi
									
					else
						zenity --info --text "Filen $backupname är skrivskyddad så backupen kunde inte tas."
					fi
				else
					zenity --info --text "Backupen är ej genomförd"			
				fi
			else
				cp "$1" "$backupname"
				if [[ $? == 0 ]] ; then # True if previos command exicutet correctly.
					zenity --info --text "Backupen är nu klar, filen $backupname har skapats."
				else
					zenity --info --text "Backupen misslyckades, kanske har du inte skrivrättigheter här"
				fi
			fi
		else
			zenity --info --text "Backupen är ej genomförd, du namngav inte filen."	
		fi
	else
		zenity --info --text "Backupen är ej genomförd"				
	fi
else

		zenity --info --text "Du har inte valt någon fil."				
fi

EDIT:
Ändrade koden lite så att den även kollar om man har skrivrättigheter, tidigare meddelade den att kopieringen var klar fasten själva kopieringen misslyckades... Nu får man ett felmeddelande om kopieringen misslyckas.
BTW så har jag gjort den här framföralt för att testa zenity och lite -f -a -n (vad de nu kallas), nämnde jag att jag gillar if satser :P
Betygsätt din Hårdvara och underlätta inköp av ny för andra:http://ubuntu-se.org/phpBB3/viewforum.php?f=138
Ubuntu-se forsknings team, här.
Min Ubuntu blogg som funkar som en stor post-it lapp för mig http://attminnas.blogspot.com/
Användarvisningsbild
SlamsornasKung
Inlägg: 886
Blev medlem: 27 jun 2009, 19:23
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: 08

Re: Dela med dig av dina bästa shell-tips

Inlägg av SlamsornasKung »

Konservburk skrev:
SlamsornasKung skrev:Koden ovan är faktiskt lite felaktig. Den sorterar ”reversed”, med andra ord hamnar de SENAST ändrade filerna SIST, det är väl snarare så att du vill se de senast ändrade filerna FÖRST.
Det är nog meningen ska du se. På det kan man enkelt och snabbt se de senast ändrade filerna direkt utan att behöva scrolla upp en massa och man slipper dessutom pipe:a vidare till less eller more eller för den delen head.
Å... då är jag med. Trodde att de senast ändrade filerna skulle hamna överst. My bad!
HP NC2400 - Ubuntu 10.04 • Fujitsu Siemens AmiloM7400 - Arch Linux • HP/Compaq Mini 110C - Ubuntu 10.04
CryingFreeman skrev:[…] Ubuntu är och förblir en meritokrati, inget demokratiskt experiment där alla får säga vad som helst till vem som helst, hur som helst.
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Dela med dig av dina egna script/*sh-tips

Inlägg av dmz »

Jag har gjort en urklippshanterardaemon med perl, bash och dmenu.
dmenuclip
Själva startar-scriptet för att kicka igång dmenu. Ruskigt fult. Just system()-raden är jag riktigt stolt över, fulare kodstycke har nog aldrig skådats

Kod: Markera allt

#!/usr/bin/perl
# dmenuclip.pl
# REALLY nasty... 
use strict;
my $xsels = "/home/scp1/.config/dmenuclip/xsel";
my $f     = '-*-fixed-*-*-*-*-15-*-*-*-*-*-*-*';
my $dmenu = 'dmenu -i -b -nb \#1c1c1c -nf \#d7005f -sb \#252525';



system("printf \$(\\cat $xsels|$dmenu -fn $f -p xsel)|xclip -i -l 1|xclip -o");
dmenuclip-syncd
Daemon som ligger i bakgrunden och kontinuterligt samlar in allt som ligger i buffern och skriver det till fil. Det är ifrån denna fil vi sedan hämtar alla urklipp, och väljer det vi vill använda oss av (som då skickas till den primära buffern).
Notera att inga duplicationer förekommer i filen (känns rätt onödigt).

Kod: Markera allt

#!/usr/bin/perl
use strict;
# dmenuclip-syncd - daemon that saves all X selections for use with dmenuclip
use Proc::Daemon;
#use Data::Dumper;

my $xsel = "$ENV{'HOME'}/.config/dmenuclip/xsel";

sub syncIt {
  print "Daemonizing...\n";
  #Proc::Daemon::Init;
  while(1) {
    open(XSEL,"<", $xsel) or die "Cant open $xsel for reading: $!";
    my @lines = <XSEL>;
    chomp @lines;
    close XSEL;
    my $currentSel = `/usr/bin/xsel -o`;
    chomp($currentSel);
    $currentSel =~ s/\n/ /g; #temporary (?) fix for the newline hassle
    #print Dumper($currentSel);
    if($currentSel ~~ @lines) {
      &syncSec(0);
    }
    else {
      open(XSEL_W, ">>", $xsel) or die "Cant open $xsel for writing: $!";
      print XSEL_W "$currentSel\n";
      close XSEL_W;
    }
    sleep 2;
  }
}

&syncIt;

# Those are deprecated, but left here for reference (and the dummy call)
sub syncPrim {
  system("/usr/bin/xclip -o --selection primary -o) >> $xsel&&printf \"\n\" >> $xsel");
}
sub syncSec {
  my $c = shift;
  unless($c == 0) {
    system("/usr/bin/xclip -o >> $xsel"); #&& printf \"\n\" >> $xsel");
  }
}
Det hela kan se ut så här;
Bild
Bilagor
screenshot.png
screenshot.png (864 Bytes) Visad 2806 gånger
Senast redigerad av 1 dmz, redigerad totalt 15 gånger.
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Användarvisningsbild
BadOmen
Inlägg: 1172
Blev medlem: 18 aug 2006, 10:45
OS: Kubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Umeå

Re: Dela med dig av dina egna script/*sh-tips

Inlägg av BadOmen »

Utanför ämnet: Lite utanför ämnet kanske men jag skulle tycka det var väldigt bra om ni kommenterar lite i er kod så att även man som nybörjare på Bash kan läsa koden och lära sig lite också. Kanske man till och med får för sig att utveckla skripten lite ifall man får mer förståelse för hur de funkar. Kanske det kan inspirera till nya skript med den nyvunna kunskapen.
För övrigt en riktigt trevlig och inspirerande tråd :)
Betygsätt din Hårdvara och underlätta inköp av ny för andra:http://ubuntu-se.org/phpBB3/viewforum.php?f=138
Ubuntu-se forsknings team, här.
Min Ubuntu blogg som funkar som en stor post-it lapp för mig http://attminnas.blogspot.com/
Skriv svar

Återgå till "Terminalforum"