간략한 C 코딩을 하는데, 우분투 16.04에서 이해하기 어려운 일이... -.-

smreo의 이미지

있습니다.

분명히 홈디렉토리에서 만들어서 확인된 것들을 못찾아갑니다. 인터넷을 뒤져서 ,profile의 path도 고쳐보고 했는데 소용이 없습니다.

=> 분명히 홈으로 가서 pwd로 확인을 했고...
1. smreo@IeeLinux:~$ cd ~
2. smreo@IeeLinux:~$ pwd
/home/smreo

=> ls -l로 파일의 존재와 권한도 확인을 하고
3. smreo@IeeLinux:~$ ls -l dir*
-rwxrwxr-x 1 smreo smreo 9232 5월 16 13:26 dir
-rw-rw-r-- 1 smreo smreo 1697 5월 16 15:31 dir.c
-rwxrwxr-x 1 smreo smreo 8768 5월 16 17:23 dirc
-rw-rw-r-- 1 smreo smreo 565 5월 16 17:23 dirchk.c
-rw-rw-r-- 1 smreo smreo 2401 5월 15 15:55 dirman.c

=> dirc를 실행하면 이렇게 나옵니다.
4. smreo@IeeLinux:~$ dirc
bash: dirc: 명령어를 찾을 수 없음

=> 그래서 패스를 앞에 붙이면 실행은 됩니다. 그런데 찾으려는 프로그램 속에서 제시하는 디렉토리를 못찾아갑니다. 홈에 있는 대부분의 파일들도 저런 식으로 ~/를 붙여줘야 실행이 됩니다.
5. smreo@IeeLinux:~$ ~/dirc
given path : ~/eMap_DBbef
지정한 경로에 파일⁄폴더가 존재하지 않습니다.

어떤 프로그램을 하다가 인풋 디렉토리를 못찾아가서 단순히 디렉토리 확인만 하는 샘플 소스를 구해서 실제로 못찾아가는지 테스트 하는 중입니다. 그런데 디렉토리 패스를 문자열에 넣어줘도 안되고 직접 줘도 못찾아갑니다. 왜 이럴까요?

  4 int main()
  5 {
  6     char strPath[] = {"~/eMap_DBbef"};
  7 
  8     printf(" given path : %s\n", strPath) ;
  9     /*  int nResult = access(strPath, 0);        strPath를 못찾아가서 literal 로 지정 */
 10     int nResult = access("~/eMap_DBbef", 0);   
 11              
 12     if(nResult == 0)
 13     {
 14             printf("지정한 경로에 파일⁄폴더가 존재 합니다.\n");
 15     }
 16         else if(nResult == -1)
 17           {
 18             printf("지정한 경로에 파일⁄폴더가 존재하지 않습니다.\n");
 19           }
 20                      
 21     return 0;
 22 }

=> 디렉토리는 분명히 있습니다. 아래 eMap_DBbef를 읽어서 거기 있는 파일들을 eMap_DBaft로 옮기면서 DB에 부어줘야 하는데...
6. smreo@IeeLinux:~$ ls -l eMap* -d
drwxrwxr-x 2 smreo smreo 4096 5월 13 17:55 eMap_DBaft
drwxrwxr-x 2 smreo smreo 57344 5월 15 13:18 eMap_DBbef
drwxrwxr-x 2 smreo smreo 57344 5월 15 13:18 eMap_received

희한한 것은 -d를 안주면 서브디렉토리까지 읽어버립니다. 그것도 좀 이해안되고...

원래는 디렉토리 앞에 특수문자(@)를 붙였었는데..., 그것 때문에 못찾아가나 하고 바꿨는데도 마찬가지 입니다.

더 이상한 것은, 명령이나 실행 파일들은 못찾아가면서 프로그램에서는 디렉토리 패스를 헤더파일에 넣어서 했는데 그건 "~/"없이 그냥 "indir.h"라고만 써줘도 잘 읽어오더라구요.
왜 이럴까요?
도와주세요. -.-

추기 : "@" 가 직전 문자를 반복하는 기능이 있다는 걸 오늘 처음 알았네요. 웃음도 나오고...

세벌의 이미지

echo $PATH
하면 어떻게 나오나요?

smreo의 이미지

bash: /home/smreo/bin:/home/smreo/.local/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/bin/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/java/jdk1.8.0_131:/snap/bin:/usr/lib/jvm/java-8-oracle/bin:/usr/lib/jvm/java-8-oracle/db/bin:/usr/lib/jvm/java-8-oracle/jre/bin: 그런 파일이나 디렉터리가 없습니다

익명 사용자의 이미지

Quote:
=> dirc를 실행하면 이렇게 나옵니다.
4. smreo@IeeLinux:~$ dirc
bash: dirc: 명령어를 찾을 수 없음

./dirc 식으로 실행시키셔야 합니다. PATH 안에 현재 디렉터리는 기본적으로 제외되어 있습니다.

Quote:
5. smreo@IeeLinux:~$ ~/dirc
given path : ~/eMap_DBbef
지정한 경로에 파일⁄폴더가 존재하지 않습니다.

~ 기호가 현재 홈 디렉터리로 치환되는 것은 셸이 하는 일입니다. 즉 프로그램에 집어넣기 전에 치환된다는 거죠. C 코드 안에서 ~ 기호를 쓰면 치환되지 않습니다.

Quote:
. smreo@IeeLinux:~$ ls -l eMap* -d
drwxrwxr-x 2 smreo smreo 4096 5월 13 17:55 eMap_DBaft
drwxrwxr-x 2 smreo smreo 57344 5월 15 13:18 eMap_DBbef
drwxrwxr-x 2 smreo smreo 57344 5월 15 13:18 eMap_received

희한한 것은 -d를 안주면 서브디렉토리까지 읽어버립니다. 그것도 좀 이해안되고...

마찬가지로 * 기호 역시 셸에서 치환하기 때문에 해당 명령은 'ls -l eMap_DBaft eMap_DBbef eMap_received'와 같이 실행됩니다.

smreo의 이미지

1. ~ 기호가 현재 홈 디렉터리로 치환되는 것은 셸이 하는 일입니다. 즉 프로그램에 집어넣기 전에 치환된다는 거죠. C 코드 안에서 ~ 기호를 쓰면 치환되지 않습니다.

2. * 기호 역시 셸에서 치환하기 때문에 해당 명령은 'ls -l eMap_DBaft eMap_DBbef eMap_received'와 같이 실행됩니다.

성의있는 답변에 감사드립니다. 혹시 $PATH에 현재 디렉토리 "."를 추가하면 어떨까요?
사실은 HOME/.profile, HOME/.bashrc 어느 걸 고쳐야 할지도 모릅니다. 오랜 만에 일하려니 너무 깝깝하고... -.-

freedom의 이미지

ubuntu 에서 bash 를 쓰고 계신듯 한데, 그럼 당연히 bashrc 를 쓰시는게 맞습니다.
예전 debian 나 ubuntu 에서 .profile 가 우선 적용되고 shell에따라 .bashrc 도 적용되었던거 같은데
ubuntu 16.04 에서 확인해보니 그렇지 않는군요.

 의 이미지

두 가지 문제가 있군요.

1. 쉘에서 프로그램을 실행시킬 때는 반드시 경로를 붙여야 합니다.
아예 /부터 시작하는 절대경로를 쓰거나, 설령 상대 경로를 쓰더라도 최소한 ./는 붙여야 합니다.

프로그램 이름만을 이용해서 실행시키려면 해당 프로그램이 PATH 환경 변수에 등록된 경로에 있어야 하지요.

2. ~를 홈 경로로 치환하는 것은 쉘에서 지원하는 기능입니다.
프로그램에서 syscall을 직접 호출할 때는 이러한 쉘의 서비스를 받을 수 없습니다.

access("~/eMap_DBbef", 0); 말고 access("/home/smreo/eMap_DBbef", 0); 라고 호출해보세요.

홈 경로를 하드코딩하지 않고 런타임에 알아내고 싶으신가요? HOME 환경 변수를 읽으세요.

smreo의 이미지

이십여 년 전에 HP-UX에서 pgm을 실행하면 잘되는데 cron tab에 등록해서 돌리면 안되더라구요.
며칠동안 애먹다가 cron은 환경변수를 안갖고 있다는 걸 알게 됐는데... 같은 이치로군요. 쉘은 환경과 무관한 기냥 프로그램인듯...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.