Why is ./ sometimes needed?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Why is ./ sometimes needed?
# 15  
Old 01-30-2019
Well, wisecaracker, I see your point, but - IF a script does such delicate things that needs root privileges, it certainly should NOT reside in a user's $HOME/bin. And, sudo is so flexible to setup that only the eligible user can use cleanup2 in a public directory.
This User Gave Thanks to RudiC For This Post:
# 16  
Old 01-30-2019
Quote:
Originally Posted by bakunin
Try sudo echo $PATH and most probably /your/home/bin will not be included in it.
Except that your shell will evaluate $PATH before executing sudo. Instead you would need to do the somewhat iffy looking
Code:
sudo bash -c "eval echo \$PATH"

or better still get use sudo -i and check your path.
Quote:
Originally Posted by RudiC
Well, wisecaracker, I see your point, but - IF a script does such delicate things that needs root privileges, it certainly should NOT reside in a user's $HOME/bin. And, sudo is so flexible to setup that only the eligible user can use cleanup2 in a public directory.
Agreed. So place the program in /usr/local/sbin, which on my system at least, is in root's path when using sudo. And make it executable (and readable?) only by root.

Andrew
These 2 Users Gave Thanks to apmcd47 For This Post:
# 17  
Old 01-30-2019
I appreciate the help; I've learned a lot!

Here`s the original script, which I did not write.



Code:
#!/bin/bash
 

# Proper header for a Bash script
# cleanup2: improved
# Run as root, of course.
# Insert code here to print error message and exit if not root.

LOG_DIR=/var/log
# Variables are better that hard-coded values.
cd $LOG_DIR

cat /dev/null > messages
cat /dev/null > wtmp

echo "Logs cleaned up."

exit    #  The right and proper method of "exiting" from a script.
        # A bare "exit" (no parameter) returns the exit status
        #+ of the preceding command.

# 18  
Old 01-30-2019
Quote:
Originally Posted by Xubuntu56
I appreciate the help; I've learned a lot!

Here`s the original script, which I did not write.



Code:
#!/bin/bash
 

# Proper header for a Bash script
# cleanup2: improved
# Run as root, of course.
# Insert code here to print error message and exit if not root.

LOG_DIR=/var/log
# Variables are better that hard-coded values.
cd $LOG_DIR

cat /dev/null > messages
cat /dev/null > wtmp

echo "Logs cleaned up."

exit    #  The right and proper method of "exiting" from a script.
        # A bare "exit" (no parameter) returns the exit status
        #+ of the preceding command.

IS THAT IT, (and needs to be run from root)?
Why use:
Code:
cat /dev/null > messages
cat /dev/null > wtmp

When:
Code:
: > messages
: > wtmp

......is much simpler.
Useless use of cat?
No disrespect to you Xubuntu56, you are innocent of this one...
BUT THAT........
........guys was the improved version, what was the original like I wonder!

Last edited by wisecracker; 01-30-2019 at 11:29 AM..
This User Gave Thanks to wisecracker For This Post:
# 19  
Old 01-30-2019
Hopefully this does NOT attach to MY previous post.
A rewrite of the code to have an optional user path.
Usage: cleanup2 [/optional/full/path/to]
Code:
#!/bin/sh
# Usage: cleanup2 [/optional/full/path/to]
# POSIX compliant.
# Due to '/var/log/' this HAS to be run from root.
# No need to detect root as the error generated is enough.

# Attempt to obtain the user path argument.
LOG_DIR="$1"

# Fall back to the default if user path is NOT supplied.
if [ "${LOG_DIR}" = "" ]
then
    LOG_DIR="/var/log"
fi

# *****************************
# Not required but commented out so you can try both meathods.
# cd "${LOG_DIR}"
# Clear require files. ":" is a NULL, NOP or true command.
# : > messages
# : > wtmp
# These eight lines can be deleted.
# *****************************

# Create empty files in the required path.
: > "${LOG_DIR}"/messages
: > "${LOG_DIR}"/wtmp

# Print success and exit script.
echo "Success! Logs cleaned up."
exit

Results:
OSX 10.14.1, default bash terminal, code calling 'sh'.
Code:
AMIGA:amiga~/Desktop/Code/Shell> chmod 700 cleanup2
AMIGA:amiga~/Desktop/Code/Shell> ls -l /tmp/
total 0
drwx------  4 root   wheel  128 16 Nov 12:34 PKInstallSandbox.MMTz8b
drwx------  3 amiga  wheel   96 30 Jan 18:07 com.apple.launchd.CPHRzeQ4Vr
drwx------  3 amiga  wheel   96 30 Jan 18:07 com.apple.launchd.qgu8OpjEvP
drwxr-xr-x  2 root   wheel   64 30 Jan 18:00 powerlog
AMIGA:amiga~/Desktop/Code/Shell> ./cleanup2 /tmp
Success! Logs cleaned up.
AMIGA:amiga~/Desktop/Code/Shell> echo $?
0
AMIGA:amiga~/Desktop/Code/Shell> ls -l /tmp/
total 0
drwx------  4 root   wheel  128 16 Nov 12:34 PKInstallSandbox.MMTz8b
drwx------  3 amiga  wheel   96 30 Jan 18:07 com.apple.launchd.CPHRzeQ4Vr
drwx------  3 amiga  wheel   96 30 Jan 18:07 com.apple.launchd.qgu8OpjEvP
-rw-r--r--  1 amiga  wheel    0 30 Jan 19:44 messages
drwxr-xr-x  2 root   wheel   64 30 Jan 18:00 powerlog
-rw-r--r--  1 amiga  wheel    0 30 Jan 19:44 wtmp
AMIGA:amiga~/Desktop/Code/Shell> ./cleanup2
./cleanup2: line 25: /var/log/messages: Permission denied
AMIGA:amiga~/Desktop/Code/Shell> echo $?
1
AMIGA:amiga~/Desktop/Code/Shell> _

This User Gave Thanks to wisecracker For This Post:
# 20  
Old 01-30-2019
Quote:
Originally Posted by apmcd47
Except that your shell will evaluate $PATH before executing sudo. Instead you would need to do the somewhat iffy looking
Code:
sudo bash -c "eval echo \$PATH"

Andrew, you are right. My excuse is that my dog ate the single quotes. ;-)) It was meant to be sudo echo '$PATH', but you are equally right about sudo -i.

Quote:
Originally Posted by Xubuntu56
Code:
echo "Logs cleaned up."

exit    #  The right and proper method of "exiting" from a script.
        # A bare "exit" (no parameter) returns the exit status
        #+ of the preceding command.

This observation is correct but the return code being returned will be that of echo, no? To be honest i have never seen this command reurn anything else than TRUE. I would have a hard time even conceiving a situation where it fails. But you probably want to base the return code not on the success ot the echo but on the success of cleaning the logs.

It makes sense to base the return code of scripts on the success (or lack of it) of certain critical commands. The way to do that is like this: suppose your script will have - at its core - to execute three commands: command1, command2 and command3 in that order. Now, each of these commands could fail and you want to be able to find out how your script has failed - has it failed to execute command1? Or command2 or command3? So let us say you want to exit your script with:

0 when it succeeds (that is: all three commands excuted successfully);
1 when excuting command1 failed (the others are skipped in that case);
2 when excuting command2 failed (the last is skipped in that case);
3 when excuting command3 failed;

The logic to implement that is like this:

Code:
#! /bin/bash
if ! command1 ; then
     exit 1
fi
if ! command2 ; then
     exit 2
fi
if ! command3 ; then
     exit 3
fi
exit 0

The if executes any command and branches based on the return code of that command "!" is just a logical NOT and means branch if the command returns a non-zero (=logical FALSE) return code. Note that it doesn't matter exactly how the commands fail - they could have all sorts of error codes. This is why this is only the most basic form of logging, but since you do understand now the principle i am sure you can come up with more elaborate solutions should you need them.

Quote:
Originally Posted by wisecracker
IS THAT IT, (and needs to be run from root)?
Code:
: > messages
: > wtmp

......is much simpler.
Dear brother of the church of ongoing simplification, you surely noticed by now that you wasted four (!!) perfectly usable keystrokes with your solution too, no? This:
Code:
> messages
> wtmp

is even simpler than the much simpler solution. ;-))

I hope this helps.

bakunin
These 2 Users Gave Thanks to bakunin For This Post:
# 21  
Old 01-30-2019
Hi bakunin...


Ha ha, yes i know about > filename but ':' is something else that the OP has learnt and is much more pleasing to the eye. <wink>

':' is a NOP or true, (or NULL), and can even be used as a command that does nothing at all but is a place-marker for code under development.
This User Gave Thanks to wisecracker For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Help needed

First of all, let me state that I am a windows admin. I have a windows share mounted to /mnt/server I need a script that will either login as sudo or perform commands with sudo rights. I need the script to copy all of the users /home folders to the mounted windows share. Now If I can... (2 Replies)
Discussion started by: EricM
2 Replies

2. Shell Programming and Scripting

Help Needed

please reply for this https://www.unix.com/shell-programming-scripting/111493-cutting-lines.html its really urgent (1 Reply)
Discussion started by: jojo123
1 Replies

3. Shell Programming and Scripting

help needed...

Guys, There is a file where there are 1000s of records. In the file if some condition satisfies in a certain TAB record (TAB would be first 3 digits of a certain record) then move TAB and all the records (or lines) after TAB to new_file, until another TAB record is encountered in the same... (1 Reply)
Discussion started by: Prat007
1 Replies

4. Shell Programming and Scripting

Help needed ....

Hi... I have a folder /home/data ;where some files are present. aaa_asas.txt bbb_xxx.txt ccc_xsxas.txt ddd_sa2esa.txt ------ Also I have a file which is as follows.(/home/file1) cat /home/file1 aaa you bbb are ccc very ddd good -------- now I want to rename all the files in the folder... (7 Replies)
Discussion started by: newbee1
7 Replies

5. UNIX for Dummies Questions & Answers

Help needed please.

i've been given an assignment to Write a system utility called recycle that satisfies the following requirements as they might be displayed in a UNIX/Linux man page: NAME recycle - stores files in a recycle bin SYNOPSIS recycle ... DESCRIPTION Recycle is a replacement for the... (3 Replies)
Discussion started by: jerryboy78
3 Replies

6. UNIX for Dummies Questions & Answers

little help needed..

hi everyone i'm a noob trying to learn unix language.. but seems like i got no leads on how to start.. i'm playing with the 'ps' command.. i'm trying to show the pid, ppid, username, command, cpu utilization (in desc order), process start time and process status.. all in a command.. am i able... (3 Replies)
Discussion started by: hilofat
3 Replies

7. AIX

Little help needed.

Hello, I am quite new to AIX, but have Linux experience. Iam facing a peoblem with AIX 5.2 running on a 43p Model 150 (RS6000). I tried everyting and i cant have the network to run properly. :confused: /etc/hosts looks like this: 127.0.0.1 loopback localhost 192.168.XXX.XXX... (5 Replies)
Discussion started by: Netghost
5 Replies

8. UNIX for Dummies Questions & Answers

Help needed

HI can any one help me with the appropriate answers for the below: 1.Enter an # before a command and press .what do you see,and how do you think you can take advantage of the behaviour? 2.Is tar -cvfb20foo.tar*.c legitimate or not.will this command work without the - symbol? 3.The command... (1 Reply)
Discussion started by: akhil1460
1 Replies

9. UNIX for Dummies Questions & Answers

Help needed

Hello I am a newbie and want to learn unix . Does unix and linux are one and same. I have red hat linux cd but i want to take advice from some one wheather unix and linux are same. If not ,where i'll get a Unix os setup and how i'll install it. If linux would do then how should... (3 Replies)
Discussion started by: hunter87
3 Replies

10. Shell Programming and Scripting

Help is needed

Hi I'm trying to print a directories struct tree that will look like this: A _a _b _B __c __d __C ___e B _a _b I'm doing a recursion, but how can I know how much space is needed before printing after the recursion? (3 Replies)
Discussion started by: abcde
3 Replies
Login or Register to Ask a Question