Portál AbcLinuxu, 30. dubna 2025 16:52
Protože se mi často stává, že si při mazání více souborů omylem vymažu celý obsah adresáře, protože se mi do zápisu připlete *, rozhodnul jsem se, že si napíšu takový malý wrapper pro rm -fr v C.
Už ho mám skoro hotový, ale mám jeden problém. Když jsem ho spustil, tak jsem zjistil, že Bash do toho příkazu předává už přímo expandovanou *
#include <stdio.h> #include <strings.h> #include <unistd.h> #include <stdlib.h> int main(int argc, char *argv[]) { int i, opt; for(i=1;i<argc;i++) { if (strcasecmp(argv[i],"*")==0) { printf("Opravdu chcete vymazat vsechny soubory v tomto adresari? (A/N)"); opt=getchar(); if (opt=='N') { exit(1); } else if (opt=='A') { break; } } } argv[0]="rm"; execvp("rm", argv); exit(0); }
A proto mi nefunguje zvýrazněný řádek strcasecmp. Jde to nějak obejít?
Tiskni
Sdílej:
Zrovna jsem chtěl napsat, že v zsh stačí nenastavit RM_STAR_SILENT.
int i, opt;
moc nechápu, opt je integer (A/N má nějaké číslo?, nějak to nesedí)?
... jsou v C taky typu int.A jinde mají typ třeba char, ale lze je v pohodě "převést na čísla".
char
je taky číslo, co jiného by to bylo.
int
a na běžných platformách má také typicky jinou velikost.
#include <stdio.h> int main() { printf("sizeof('a') je %d\n", sizeof('a')); if (__builtin_types_compatible_p(typeof('a'), int)) printf("'a' je typu int\n"); if (__builtin_types_compatible_p(typeof('a'), char)) printf("'a' je typu char\n"); return 0; }Výsledek:
sizeof('a') je 4 'a' je typu int
alias myrm="touch neco; srm"
, kde neco
bude nějaká nejlépe exotická věc - např. jeden znak, který by nikoho nenapadlo dát do názvu souboru, ale být v něm může. srm se pak podívá, jestli má na vstupu neco
, když jo, tak jeden z parametrů byl *, ?*, *? (což je obojí to samé jako *), ?, nic jiného mě teď nenapadá. neco
samozřejmě vždycky smaže.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.