On 3/15/25 09:11, Otto Moerbeek wrote:
> On Sat, Mar 15, 2025 at 08:55:18AM +0100, Christian Schulte wrote:
> 
>> On 3/15/25 07:37, Otto Moerbeek wrote:
>>> On Sat, Mar 15, 2025 at 07:29:39AM +0100, Christian Schulte wrote:
>>>
>>>> Hi @misc,
>>>>
>>>> I recently stumbled upon an issue with GNU printf(1). I was using
>>>> echo(1) in a testsuite.at on OpenBSD successfully, but that failed on
>>>> linux badly. The OpenBSD man page of echo(1) contains this sentence:
>>>>
>>>> Where portability is paramount, use printf(1).
>>>>
>>>> So I replaced echo(1) with printf(1). This leads to...
>>>>
>>>> OpenBSD:
>>>>
>>>> x500$ printf -0
>>>> -0x500$ printf -something
>>>> -somethingx500$
>>>>
>>>> which is the expected output. On linux I get
>>>>
>>>> schulte@vps:~$ printf -0
>>>> -bash: printf: -0: invalid option
>>>> printf: usage: printf [-v var] format [arguments]
>>>> schulte@vps:~$ printf -something
>>>> -bash: printf: -s: invalid option
>>>> printf: usage: printf [-v var] format [arguments]
>>>>
>>>> Would you rate this a bug in GNU printf(1)?
>>>>
>>>> -- 
>>>> Christian
>>>>
>>>
>>> No, i would rate as a usage error. Use -- to separate options form the
>>> rest of the arguments.
>>>
>>> print -- -0
>>>
>>>     -Otto
>>
>> Thanks. Adding -- everywhere should make it portable. Would you mind
>> explaining the following to me as well?
>>
>> For example:
>>
>> x500$ echo -n \\u0041
>> \u0041x500$
>>
>> Expected output.
>>
>> x500$ printf -- \\u0041
>> printf: unknown escape sequence `\u'
>> u0041x500$
>>
>> x500$ printf -- \\\u0041
>> printf: unknown escape sequence `\u'
>> u0041x500$
>>
>> x500$ printf -- \\\\u0041
>> \u0041x500$
>>
>> Why does printf(1) require four backslashes to yield the same output?
>> The man page just mentions:
>>
>> \\      Write a backslash character.
>>
>> I would have expected \\\\ to write two backslash characters. Is this
>> related to the shell, or to the command?
>>
>> -- 
>> Christian
>>
> 
> It's the shell plus echo does not care about backslashes while printf
> does, and \u is an unknown escape sequence to printf. See the shell
> man page of how shell quoting and backslashes work (Command syntax and
> Quoting sections).
> 
>       -Otto
> 

No idea how many shells there are around doing things the way the do.
Running "grep printf configure" on the configure script generated by the
GNU toolchain shows a lot of "printf" without --. Running "grep echo
configure" seems they use echo when needing to use backslashes. Maybe I
am just a bit too paranoid about portability. Just pushed it to github.
May it blow up on everyone else but me. Funny thing is that after nearly
3 decades of Java development I must admit how blind, lazy and
incompetent one gets. Thanks a lot for helping me.

-- 
Christian

Reply via email to