When I try to use a file name in a variable for the cs add command, I cannot understand what happens. I'm using a bash script myscript.sh which returns the path name of cscope database (/mydir/cscope.out) based on the current file name (/mydir/myfile.py):

:let db = system("myscript.sh " . expand("%:p"))

After that, when I call:

:cs add db

I get:

"E563: stat(/mydir/db) error 2"

When I call:

:exe "cs add " . db

I get:

"E563: stat(/mydir/cscope.out^@) error 2"

/mydir/cscope.out is the right file name which returned by myscript.sh, but where the ^@ thing comes from? How do I correctly use the variable with a parameter in this case?

P.S. When cs add is called with plain file name:

:cs add /mydir/cscope.out

Connection is created OK and no errors is reported.

:echo db



Press ENTER or type command to continue
  • 2
    ^@ is Ctrl-@, indicating the ASCII NUL character, which shouldn't be there since system replaces NULs with SOH (^A).
    – muru
    Dec 16, 2015 at 12:46
  • 1
    Not sure, but maybe your script myscript.sh includes a new line character at the end of its output. ^@ is the caret notation of a null character (en.wikipedia.org/wiki/Null_character). You could try getting rid of it like this: let db=system("myscript.sh " . expand("%:p"))[:-2] or let db=substitute(system("myscript.sh " . expand("%:p"), '\n$', '', '') or let db=substitute(system("myscript.sh " . expand("%:p"), '[[:cntrl:]]', '', 'g'). Not tested so I don't know if any of these commands will work in your particular case. Found them here : superuser.com/a/935646
    – saginaw
    Dec 16, 2015 at 12:51
  • @muru Thanks. The myscript.sh indeed uses -print0 in the 'find' command.
    – Al Berger
    Dec 16, 2015 at 12:54
  • @saginaw Thanks, your answer solves the issue.
    – Al Berger
    Dec 16, 2015 at 12:55

1 Answer 1


If you're using GNU find for this, then perhaps you can use the -printf option:

find /some/path -name cscope.out -printf '%p' -quit

This will just print the path of the matched file without any additional characters. -quit instructs it to exit after the first match. This should avoid the extra NUL and let you use the :exe command.

  • I use the 'find' for listing files in the project directory tree, which are used for building db (cscope work only with *.c files by default). But 'find' works OK without -print0 as well (-print0 is needed for filenames with \n, as I understand).
    – Al Berger
    Dec 16, 2015 at 13:50
  • @AlBerger -print0 is useful if you're handling multiple files in the output, but from what you have said so far, it seems to me the script only outputs one filename.
    – muru
    Dec 16, 2015 at 13:53
  • Yes, the script outputs the name of the database, but it also rebuilds it when it's connected for the first time (the 'find' is used for rebuilding the database).
    – Al Berger
    Dec 16, 2015 at 14:40
  • Well, if 'find' is used for rebuilding, then where the \0 comes from? =) I don't know. The file name is outputted with 'echo $dbname'. Anyways, the issue was solved by [:-2]
    – Al Berger
    Dec 16, 2015 at 14:43
  • @AlBerger then we have a doubly impossible scenario: echo isn't going to print a NUL (not like that anyway), and system replaces NULs, as I previously noted.
    – muru
    Dec 16, 2015 at 16:55

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.