Kernel Hacks & Weird Filenames (should be: shell restrictions)

Larry Dighera root at conexch.UUCP
Mon May 16 04:03:28 AEST 1988


In article <3267 at phri.UUCP> roy at phri.UUCP (Roy Smith) writes:
>gwyn at brl.arpa (Doug Gwyn (VLD/VMB) <gwyn>) writes:
>> Geez.  Haven't you heard of "pipes and filters"?  Pipe the output of "ls"
>> into a filter [...]
>
>	In this case, it's a little bit complicated since the filter would
>have to be syntax-sensitive.  Just doing "ls | cat -v" is no good because you
>want to escape \n in file names but not at the end of lines.  You probably
>want to escape spaces in file names but no place else, etc.  I'm sure it's
>possible to write some sort of sed command which takes:
>
>-rw-r--r--  1 roy           491 Apr 27 14:01 calendar
>-rw-r--r--  1 roy           817 May 11 13:15  foo bar
>
>and correctly figures out that the second file name is " foo bar" and only
>escapes those two spaces, but it would be ugly and difficult.  Try and make
>that filter general enough to deal with the varient formats of "ls", "ls -l",
>"ls -ls", "ls -lsi", and "ls -lsig" and it sure starts to look like building
>control-character escapes into ls isn't such a bad idea after all.
>-- 
>Roy Smith, System Administrator
>Public Health Research Institute
>455 First Avenue, New York, NY 10016
>{allegra,philabs,cmcl2,rutgers}!phri!roy -or- phri!roy at uunet.uu.net

I must not understand the problem here, because this all looks very simple
to me.  

First, SCO Xenix's ls command supports the -b option which forces printing of
non-graphic characters in file names to be in the octal \ddd notaion.

Secondly, ls * | od -c essentially does the same.

Thirdly, here's a filter that displays all characters printable or not:


/* see.c    04/30/1986  20:14:14    Steve Kirby  */
 
#include <stdio.h>
#include <ctype.h>
 
main(argc,argv)
int argc;  char **argv;
{
  char *prog = argv[0];
 
  FILE *fopen(), *iFP;
 
  if (++argv, --argc)  
    for ( ; argc; ++argv, --argc)
    {
      if ( ( iFP = fopen(*argv,"r") ) == NULL )
        fprintf(stderr, "%s: can't open %s \n", prog, *argv ),  exit(1);
 
      see(iFP),   fclose(iFP);
    }
  else
    see(stdin);
 
  exit(0);
 
}
 
 
see(iFP)
FILE *iFP;
{
  int c;
 
  while ( ( c = getc(iFP) ) != EOF )
    if ( iscntrl(c) )
      printf("^%c%s", c + '@', c=='\n' ? "\n" : "" );
    else
      putchar(c);
 
}
 
/* eof see.c  */
 
Specifically what are you trying to do?  Can you give an example of a
command that you are trying to execute that prompted you to post your article?

Best Regards,
Larry Dighera


-- 
USPS: The Consultants' Exchange, PO Box 12100, Santa Ana, CA  92712
TELE: (714) 842-6348: BBS (N81); (714) 842-5851: Xenix guest account (E71)
UUCP: conexch Any ACU 2400 17148425851 ogin:-""-ogin:-""-ogin: nuucp
UUCP: ...!ucbvax!ucivax!icnvax!conexch!root || ...!trwrb!ucla-an!conexch!root



More information about the Comp.unix.wizards mailing list